如何以编程方式启用的Android /禁用无障碍服务如何以编程方式启用的Android /禁用无障碍

2019-05-13 11:29发布

我想以编程方式启用/下设置 - >辅助功能选项中列出的禁用无障碍服务。

我可以开始辅助意向象下面这样:

Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent, 0);

但我没有关于如何启用通过我的代码视图中列出的服务的想法。

请给我你的意见。

Answer 1:

我发现了一个解决方案,通过调用工作对我来说

Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "pkgname/classname");
Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ACCESSIBILITY_ENABLED, "1");

pkgname是你的包名和classname是您的无障碍服务的类名。

如果您需要启用一些服务,或者你不想destory以前的设置,你可能要使用:以单独的其他服务。

你可能还需要一个系统的应用程序运行,你可能需要下列权限

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

然而,根据@Rupert罗恩斯利这可能不是在Android的某些版本的工作,我在Android 4.0.4的工作,并希望它为你工作。

PS。 如果它不工作,也许你会发现在一些运气/data/data/com.android.providers.settings/databases/settings.db/secure ,这就是Android的店安全设置。



Answer 2:

从安卓6.0,你可以使用:

adb shell settings put secure enabled_accessibility_services packagname/servicename

从旧版本的settings.db不再出现在Android 6.0。



Answer 3:

Android中7(API 24),AccessibilityService可以通过调用编程方式禁用本身disableSelf()方法。



Answer 4:

AccessibilityService是特殊的,不能以编程方式启动。



Answer 5:

你能做的最好的是manualy与打开平易设置:

意向意图=新意图(Settings.ACTION_ACCESSIBILITY_SETTINGS)

并启动意图 - 你也可以做到这一点从prefernece xml文件:

Android的意图:行动= “android.settings.ACCESSIBILITY_SETTINGS”



Answer 6:

万一有人仍在追寻你是停留在你的锁屏输入密码或PIN时,亚行关闭对讲。 有一两件事你可以尝试是adb shell am force-stop com.google.android.marvin.talkback



Answer 7:

在仪器的测试,我开始喜欢这个我的无障碍服务:

private fun enableAccessibilityService() {
    val packageName = "com.example"
    val className = "$packageName.service.MyService"
    val string = "enabled_accessibility_services"
    val cmd = "settings put secure $string $packageName/$className"
    InstrumentationRegistry.getInstrumentation()
      .getUiAutomation(UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES)
      .executeShellCommand(cmd)
      .close()
    TimeUnit.SECONDS.sleep(3)
}

我在Android 6和8这也适用于非系统应用程序进行测试。



Answer 8:

这里是工作的解决方案(如果你的活动不运行它,将禁用本身)

@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    Toast.makeText(this, "Connected!",Toast.LENGTH_SHORT).show();
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1);
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
        public void run() {
            serviceChecker();
        }
    }, 0, 5, TimeUnit.SECONDS);
}

private void serviceChecker(){
    if(!isActivityRunning(MainActivity.class)) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            disableSelf();
        }
    }
}
protected Boolean isActivityRunning(Class activityClass)
{
    ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (ActivityManager.RunningTaskInfo task : tasks) {
        if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
            return true;
    }

    return false;
}


Answer 9:

我发现这个职位: 如何以编程方式检查服务是否在AndroidManifest.xml中声明? 。 约PackageManager,它告诉你什么是运行顶端回答会谈。



文章来源: How to Programmatically Enable/Disable Accessibility Service in Android