38

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

我可以像下面这样启动可访问性意图:

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

但是我不知道如何通过我的代码启用视图中列出的服务。

请给我你的意见。

4

11 回答 11

26

我通过调用找到了一个对我有用的解决方案

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

其中pkgname是你的包名,classname是你的无障碍服务的类名。

如果您需要启用多项服务,或者您不想破坏以前的设置,您可能希望使用这些设置:来分隔其他服务。

此外,您可能需要作为系统应用程序运行,并且可能需要以下权限

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

但是,根据@Rupert Rawnsley的说法,这可能不适用于某些版本的 Android,我正在使用 Android 4.0.4 并希望它对您有用。

PS。如果它不起作用,也许你可以找到一些运气/data/data/com.android.providers.settings/databases/settings.db/secure,那是 Android 存储安全设置的地方。

于 2015-01-29T08:24:09.060 回答
15

从 Android 6.0 开始,您可以使用:

adb shell settings put secure enabled_accessibility_services packagname/servicename

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

于 2016-08-14T05:01:36.773 回答
13

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

于 2016-11-07T09:10:38.733 回答
6

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

于 2012-05-24T15:33:31.887 回答
5

您可以做的最好的事情是手动打开辅助功能设置:

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

并开始意图 - 您也可以从首选 xml 文件中执行此操作:

意图 android:action="android.settings.ACCESSIBILITY_SETTINGS"

于 2014-12-03T12:24:47.567 回答
3

您可以通过用冒号分隔多个应用程序来启用无障碍服务,如下所示:

adb shell settings put secure enabled_accessibility_services com.app1/com.app1.MyAccessibilityService:com.app2/com.app2.MyAccessibilityService
于 2021-04-09T19:34:38.707 回答
3

这是可行的解决方案(如果您的活动未运行,它将自行禁用)

@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;
}
于 2019-03-24T03:23:32.880 回答
3

以防万一当您卡在锁定屏幕中输入密码或 PIN 码时,仍然有人试图关闭来自 adb 的对讲。您可以尝试的一件事是adb shell am force-stop com.google.android.marvin.talkback

于 2017-03-20T23:18:59.290 回答
3

在仪器测试中,我像这样启动我的可访问性服务:

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 上进行了测试。这也适用于非系统应用程序。

于 2018-08-03T12:34:48.437 回答
0

enabled_accessibility_services 包含所有已启用的服务,以“:”分隔。类似于“服务A:服务B:服务C”

如果您替换字符串,它将启用您的服务,但您也会禁用其他所有人的服务。

正确的代码是:

    fun enableAccessibility(activity: Activity) {
        var accessibilityServices: String? = Settings.Secure.getString(
            activity.contentResolver,
            Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
        )

        if (accessibilityServices == null) {
            accessibilityServices = ""
        } else if (accessibilityServices.isNotEmpty()) {
            accessibilityServices = ":$accessibilityServices"
        }
        Settings.Secure.putString(
            activity.contentResolver,
            Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
            "${activity.applicationInfo.packageName}/${ForegroundDetectorService::class.java.canonicalName}$accessibilityServices"
        )
        Settings.Secure.putString(
            activity.contentResolver,
            Settings.Secure.ACCESSIBILITY_ENABLED, "1"
        )
    }

你只需要声明这个权限:

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

如果您是 root 或通过 adb,您只能启用此权限。

于 2021-11-21T05:46:35.007 回答
-7

我找到了这篇文章:如何以编程方式检查服务是否在 AndroidManifest.xml 中声明?. 最佳答案是关于 PackageManager,它会告诉您正在运行什么。

于 2012-04-18T15:49:44.800 回答