Android: किसी विशेष एक्सेसिबिलिटी सेवा के सक्षम होने पर आप कैसे जांचते हैं




accessibility-api (6)

सेवा सक्षम है या नहीं, इसकी जाँच करें

/**
 * 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 का उपयोग करना एक बेहतर एक आकार-फिट-सभी दृष्टिकोण है।

मैंने एक एंड्रॉइड ऐप लिखा है जिसे AccessibilityService के उपयोग की आवश्यकता है। मुझे पता है कि यह देखने के लिए जांच करें कि फोन पर एक्सेसबिलिटी सक्षम या अक्षम है, लेकिन मैं यह निर्धारित करने के लिए कोई तरीका नहीं निकाल सकता कि क्या मेरा ऐप एक्सेसिबिलिटी मेनू में विशेष रूप से सक्षम है या नहीं।

अगर AccessibilityService नहीं चल रही है, तो मैं उपयोगकर्ता को संकेत देना चाहता हूं, लेकिन ऐसा करने का एक अच्छा तरीका नहीं खोज सकता। क्या कोई एपीआई तरीके हैं जो मुझे याद आ रहे हैं जो मुझे बताएंगे कि डिवाइस पर कौन सी एक्सेसिबिलिटी सेवाएं सक्षम हैं?


आईडी प्राप्त करें जब आपकी गतिविधि सेवा अभी शुरू हुई। आपकी गतिविधि सेवा में सभी आरंभिक कॉल के बाद OnSeriviceCeonnected। इसे इस्तेमाल करो...

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

जेली बीन एपीआई की आवश्यकता है

फिर आप चल रही सेवाओं की जांच करने के लिए मार्टिन के कोड (isAccessibilityEnabled) का उपयोग कर सकते हैं।


क्या आप सिर्फ इस बात पर नज़र रख सकते हैं कि क्या सेवा इस तरह से चल रही है? यदि पहुँच सेवा सक्षम है, तो क्या उसे चालू भी नहीं होना चाहिए ??

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

 @Override
    public void onServiceConnected() {
      isEnabled = true; 
    }
 @Override 
    public void onDestroy(){ 
      isEnabled = false; 
    }

मैंने अंत में खुद से यह काम किया:

    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;
}

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);

 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();
            }
        });

जब भी राज्य परिवर्तित किया जाता है तो सूची को बुलाया जाएगा, आप अनुमति की जांच के लिए बूलियन का ट्रैक रख सकते हैं यह अनुमति की जांच के लिए सबसे सरल और सबसे हल्का समाधान है।







accessibility-api