web-dev-qa-db-ja.com

Androidでアクセシビリティサービスをプログラムで有効/無効にする方法

[設定]-> [アクセシビリティオプション]にリストされているアクセシビリティサービスをプログラムで有効または無効にします。

以下のようにアクセシビリティインテントを開始できます。

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

しかし、私のコードを介してビューにリストされたサービスを有効にする方法についてはわかりません。

ご意見をお聞かせください。

25
Abilash

私は電話して解決策を見つけた

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が安全な設定を保存します。

16
Kevin

Android 7(API 24)では、AccessibilityServiceは、 disableSelf() メソッドを呼び出すことにより、プログラムで自身を無効にできます。

8
Sam

Android 6.0から使用できます:

adb Shell settings put secure enabled_accessibility_services packagname/servicename

古いリリースのsettings.dbは、Android 6.0。

7
Zoli_K

最善の方法は、次の方法でアクセシビリティ設定を手動で開くことです。

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)

そしてインテントを開始します-また、prefernece xmlファイルからそれを行うことができます:

intent Android:action = "Android.settings.ACCESSIBILITY_SETTINGS"

5
Eran Katsav

AccessibilityServiceは特別であり、プログラムで開始することはできません。

5
Rupert Rawnsley

パスワードまたはPINを入力してロック画面で立ち往生しているときに、誰かがまだturn off adbからトークバックしようとしている場合に備えて。あなたが試すことができる一つのことはadb Shell am force-stop com.google.Android.marvin.talkback

3
adb_user

インストルメントテストでは、次のようにアクセシビリティサービスを開始します。

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 and 8でテストしました。これは、非システムアプリでも機能します。

1
Maxim Blumental

これが有効なソリューションです(アクティビティが実行されていない場合、それ自体が無効になります)

@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;
}
0
BlackShaman