AccessibilityService流程分析
- AccessibilityService开启方式
- AccessibilityService 开启原理
AccessibilityService开启方式
. 在Framework里直接添加对应用app 服务component。
loadSetting(stmt, Settings.Secure.ACCESSIBILITY_ENABLED,1);
loadSetting(stmt, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,"com.test.app/com.test.app.service.TestService");
. 在system app中动态添加
Settings.Secure.putString(getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,"com.test.app/com.test.app.service.TestService");Settings.Secure.putInt(getContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, 1);
. 通过intent跳转到settings里面手动添加
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent, 0);
AccessibilityService 开启原理
Settings界面的初始话会获取所有已安装的apk的无障碍服务并列表展示出来
用户点击开启无障碍其实最终就是通过Setting secure写入对应的accessibility服务信息后通知AccessiBilityManager bind server,AccessiBilityManager也是从Settings中读取对应的accessibility信息,所以想要使用accessibility网Settings secure写入服务信息是必须的。
@Override
142 public void onPreferenceToggled(String preferenceKey, boolean enabled) {
143 ComponentName toggledService = ComponentName.unflattenFromString(preferenceKey);
144 logAccessibilityServiceEnabled(toggledService, enabled);
145 if (!enabled) {
146 logDisabledState(toggledService.getPackageName());
147 }
148 AccessibilityUtils.setAccessibilityServiceState(getPrefContext(), toggledService, enabled);
149 }
关于默认开启无障碍服务的尝试
1 直接写入会报错
Settings.Secure.putString(getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.fg/com.fg.test.TestAliveAccessibilityService");Settings.Secure.putString(getContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, "1");Caused by: java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
2 通过权限申请的方式
可以申请成功但是依旧会permission denial
Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
原因:在android 6.0及以后,WRITE_SETTINGS权限的保护等级已经由原来的dangerous升级为signature,这意味着我们的APP需要用系统签名或者成为系统预装软件才能够申请此权限,并且还需要提示用户跳转到修改系统的设置界面去授予此权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.System.canWrite(MainActivity.this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,Uri.parse("package:" + getPackageName()));intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivityForResult(intent, 200);} else {Settings.Secure.putString(getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.fg/com.fg.test.TestAliveAccessibilityService");Settings.Secure.putString(getContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, "1");}
}