48

の使用が必要なAndroidアプリを作成しましたAccessibilityService。電話でユーザー補助機能が有効になっているか無効になっているかを確認する方法は知っていますが、ユーザー補助メニューでアプリが特に有効になっているかどうかを判断する方法がわかりません。

が実行されていない場合にユーザーにプロンプ​​トを表示したいのですがAccessibilityService、これを行うための適切な方法が見つかりません。デバイスで有効になっているユーザー補助サービスを教えてくれる、不足している可能性のあるAPIメソッドはありますか?

4

8 に答える 8

68

私は最終的にこれを自分で解決しました:

public boolean isAccessibilityEnabled() {
    int accessibilityEnabled = 0;
    final String LIGHTFLOW_ACCESSIBILITY_SERVICE = "com.example.test/com.example.text.ccessibilityService";
    boolean accessibilityFound = false;
    try {
        accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
        Log.d(LOGTAG, "ACCESSIBILITY: " + accessibilityEnabled);
    } catch (SettingNotFoundException e) {
        Log.d(LOGTAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
    }

    TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

    if (accessibilityEnabled==1) {
        Log.d(LOGTAG, "***ACCESSIBILIY IS ENABLED***: ");

        String settingValue = Settings.Secure.getString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        Log.d(LOGTAG, "Setting: " + settingValue);
        if (settingValue != null) {
             TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
             splitter.setString(settingValue);
             while (splitter.hasNext()) {
                 String accessabilityService = splitter.next();
                 Log.d(LOGTAG, "Setting: " + accessabilityService);
                 if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVICE_NAME)){
                     Log.d(LOGTAG, "We've found the correct setting - accessibility is switched on!");
                     return true;
                 }
             }
        }

        Log.d(LOGTAG, "***END***");
    }
    else {
        Log.d(LOGTAG, "***ACCESSIBILIY IS DISABLED***");
    }
    return accessibilityFound;
}
于 2011-02-24T15:05:51.440 に答える
64

APIレベル14以降、次の方法で有効なユーザー補助サービスを取得することもできますAccessibilityManager

public static boolean isAccessibilityServiceEnabled(Context context, Class<? extends AccessibilityService> service) {
    AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
    List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);

    for (AccessibilityServiceInfo enabledService : enabledServices) {
        ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;
        if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(service.getName()))
            return true;
    }

    return false;
}

使用法:

boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
于 2013-02-17T16:14:13.097 に答える
34

サービスが有効になっているかどうかを確認する

/**
 * Based on {@link com.android.settingslib.accessibility.AccessibilityUtils#getEnabledServicesFromSettings(Context,int)}
 * @see <a href="https://github.com/android/platform_frameworks_base/blob/d48e0d44f6676de6fd54fd8a017332edd6a9f096/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java#L55">AccessibilityUtils</a>
 */
public static boolean isAccessibilityServiceEnabled(Context context, Class<?> accessibilityService) {
    ComponentName expectedComponentName = new ComponentName(context, accessibilityService);

    String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(),  Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
    if (enabledServicesSetting == null)
        return false;

    TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
    colonSplitter.setString(enabledServicesSetting);

    while (colonSplitter.hasNext()) {
        String componentNameString = colonSplitter.next();
        ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);

        if (enabledService != null && enabledService.equals(expectedComponentName))
            return true;
    }

    return false;
}

使用法:

boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);

サービスが有効または無効になったことを検出する

コールバックを作成します。

ContentObserver observer = new ContentObserver() {
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        boolean accessibilityServiceEnabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
        //Do something here
    }
};

申し込む:

Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);

完了したら登録を解除します。

context.getContentResolver().unregisterContentObserver(observer);

getEnabledAccessibilityServiceList()値が値と同期していないため、これアプローチでは機能しないことに注意してくださいSettings.Secure.ENABLED_ACCESSIBILITY_SERVICES。だからこそ、使用Settings.Secure.ENABLED_ACCESSIBILITY_SERVICESする方が万能のアプローチだと思います。

于 2016-11-12T22:07:56.597 に答える
6

サービスがこのように実行されているかどうかを追跡できますか?アクセシビリティサービスが有効になっている場合、それも実行されているべきではありませんか?

public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false; 

 @Override
    public void onServiceConnected() {
      isEnabled = true; 
    }
 @Override 
    public void onDestroy(){ 
      isEnabled = false; 
    }
于 2014-11-24T15:09:10.767 に答える
2

アクティビティサービスの開始時にIDを取得します。アクティビティサービスで、すべての初期化呼び出しの後にOnSeriviceCeonnected。これを使って...

AccessibilityServiceInfo serviceInfo = this.getServiceInfo();
    String accessibilityId = serviceInfo.getId();

JellyBeanAPIが必要です

次に、Martinのコード(isAccessibilityEnabled)を使用して、実行中のサービスを確認できます。

于 2015-02-09T17:40:26.297 に答える
0

手遅れかもしれませんが、アクセシビリティサービスのステータスを確認する方法は次のとおりです。

$ adb shell dumpsys accessibility

結果:

ACCESSIBILITY MANAGER (dumpsys accessibility)
User state[attributes:{id=0, currentUser=true, accessibilityEnabled=false, touchExplorationEnabled=false, displayMagnificationEnabled=false}
           services:{}]
于 2018-08-06T07:20:22.577 に答える
-1
 AccessibilityManager accessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE);
        List<AccessibilityServiceInfo> runningservice = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);

        accessibilityManager.addAccessibilityStateChangeListener(new AccessibilityManager.AccessibilityStateChangeListener() {
            @Override
            public void onAccessibilityStateChanged(boolean b) {
                Toast.makeText(MainActivity.this, "permission "+b, Toast.LENGTH_SHORT).show();
            }
        });

状態が変更されるたびにListnerが呼び出され、ブール値を追跡して許可を確認できます。これは、許可を確認するための最も簡単で軽量なソリューションです。

于 2016-08-26T18:34:17.743 に答える
-5

これにはもっと時間が必要です

AccessibilityManager am = (AccessibilityManager) context
        .getSystemService(Context.ACCESSIBILITY_SERVICE);
于 2014-02-23T10:30:27.187 に答える