zh2650307 发表于 2022-9-14 11:55:55

E4A如何让软件无障碍功能静默自动开启?

每次使用无障碍功能需要手动打开系统设置去开启,这样操作很麻烦,需要实现自动开启功能!大佬们,有能力的可以考虑做个类库,谢谢!
App开机自启动:
    一、AndroidManifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:name=".BootReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1000">
      <action android:name="android.intent.action.BOOT_COMPLETED"></action>
      <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
二、代码:
//实现自启动功能

package lock.guardian;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootReceiverextends BroadcastReceiver
    {
      @Override
      public void onReceive(Context context, Intent intent)
      {
            if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Intent thisIntent = new Intent(context, Guardian.class);//设置要启动的app
                thisIntent.setAction("android.intent.action.MAIN");
                thisIntent.addCategory("android.intent.category.LAUNCHER");
                thisIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(thisIntent);
            }
      }
    }
三、注意手机上的设置,在自启动管理功能中将你的app加入白名单。
注册成为无障碍服务:
一、AndroidManifest:
<service
    android:name="LockGuardianService"
    android:process="system"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <!--android:label="@string/accessibility_service_label"-->
    <intent-filter>
      <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
</service>
实现悬浮窗:

一、AndroidManifest:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
二、代码:
private void showFloatingWindow() {
    if (Settings.canDrawOverlays(this)) {
      // 获取WindowManager服务
      WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

      // 新建悬浮窗控件
      Button button = new Button(getApplicationContext());
      //button.setText("Floating Window");
      button.setBackgroundColor(Color.GREEN);
      button.setAlpha(0.1f);

      // 根据android版本设置悬浮窗类型
      WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;            
            layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
      } else {
            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
      }
      
      layoutParams.format = PixelFormat.RGBA_8888;

      //设置大小
      layoutParams.width = 140;
      layoutParams.height = 140;
      
      //设置位置
      layoutParams.x = 0;
      layoutParams.y = 788;

      // 将悬浮窗控件添加到WindowManager
      windowManager.addView(button, layoutParams);
    }
}
三、很容易忽略的一点:在手机上设置这个app启用悬浮窗权限。
用代码判断的方法是在onCreate方法中加入:
//在启动服务之前,需要先判断一下当前是否允许开启悬浮窗,若无则发出提示并跳转到手动授权页面
if (!Settings.canDrawOverlays(this)) {
    Toast.makeText(this, "当前无开启悬浮窗权限,请授权", Toast.LENGTH_SHORT);
    startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())), 0);
}

低调小鱼鱼 发表于 2022-9-14 12:34:31

无障碍权限是无法自动开启的,必须用户手动打开。这不是能力的问题,这是安卓的规则。

zh2650307 发表于 2022-9-14 14:38:16

低调小鱼鱼 发表于 2022-9-14 12:34
无障碍权限是无法自动开启的,必须用户手动打开。这不是能力的问题,这是安卓的规则。 ...

哔登哥,获得root权限就能开启

低调小鱼鱼 发表于 2022-9-14 14:53:42

zh2650307 发表于 2022-9-14 14:38
哔登哥,获得root权限就能开启

现在的手机没有可以获取root权限的,都是各种手机厂商做了限制的。

3617647386 发表于 2022-9-22 07:34:12

低调小鱼鱼 发表于 2022-9-14 12:34
无障碍权限是无法自动开启的,必须用户手动打开。这不是能力的问题,这是安卓的规则。 ...

我看安卓设备管理器权限好像可以开

666611430 发表于 2022-9-27 17:48:45

牛逼 class

z861123823 发表于 2022-10-8 15:14:34

学到了。能用不?

凌伤 发表于 2022-12-26 23:08:37

现在的手机没有可以获取root权限的,都是各种手机厂商做了限制的。
页: [1]
查看完整版本: E4A如何让软件无障碍功能静默自动开启?