Question

I was wondering how could I detect if my own service is enabled. So I could check if my service is not enabled, then tell the user to enable it.

Was it helpful?

Solution

Below is the method to check if your accessibility service is enabled or not. 

Note: Change value of YOURAccessibilityService with your Service. 

// To check if service is enabled
private boolean isAccessibilitySettingsOn(Context mContext) {
    int accessibilityEnabled = 0;
    final String service = getPackageName() + "/" + YOURAccessibilityService.class.getCanonicalName();
    try {
        accessibilityEnabled = Settings.Secure.getInt(
                mContext.getApplicationContext().getContentResolver(),
                android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
        Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
    } catch (Settings.SettingNotFoundException e) {
        Log.e(TAG, "Error finding setting, default accessibility to not found: "
                + e.getMessage());
    }
    TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

    if (accessibilityEnabled == 1) {
        Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------");
        String settingValue = Settings.Secure.getString(
                mContext.getApplicationContext().getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (settingValue != null) {
            mStringColonSplitter.setString(settingValue);
            while (mStringColonSplitter.hasNext()) {
                String accessibilityService = mStringColonSplitter.next();

                Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
                if (accessibilityService.equalsIgnoreCase(service)) {
                    Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
                    return true;
                }
            }
        }
    } else {
        Log.v(TAG, "***ACCESSIBILITY IS DISABLED***");
    }

    return false;
}

And to call this method:

if (!isAccessibilitySettingsOn(getApplicationContext())) {
    startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
}

This will check and launch accessibility settings if not enabled.

OTHER TIPS

This is a modified version of Jakub Bláha's answer in java.

public boolean isAccessServiceEnabled(Context context, Class accessibilityServiceClass)
{
    String prefString = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);

    return prefString!= null && prefString.contains(context.getPackageName() + "/" + accessibilityServiceClass.getName());
}

This is somehow a smaller version, but it is working.

fun isAccessServiceEnabled(context: Context): Boolean {
    val prefString =
        Settings.Secure.getString(context.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)
    return prefString.contains("${context.packageName}/${context.packageName}.${context.getString(R.string.access_service_name)}")
}

Feel free to correct me if there is something missing.

Kotlin version based on answer of @Pankaj Kumar

inline fun <reified T> Context.isAccessibilityEnabled(): Boolean {
    var enabled = 0
    try {
        enabled = Settings.Secure.getInt(contentResolver, Settings.Secure.ACCESSIBILITY_ENABLED)
    } catch (e: SettingNotFoundException) {
        Timber.e(e)
    }
    if (enabled == 1) {
        val name = ComponentName(applicationContext, T::class.java)
        val services = Settings.Secure.getString(contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)
        return services?.contains(name.flattenToString()) ?: false
    }
    return false
}

1:Kotlin Based answer 2:Added a current package name check as well cos it will return true only if accessibility service will be Enabled for current package, Recently it was returning true if any package accessibility service enabled

  private fun checkAccessibilityPermission(): Boolean {
            var isAccessibilityEnabled = false
            (requireActivity().getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager).apply {
                installedAccessibilityServiceList.forEach { installedService ->
                    installedService.resolveInfo.serviceInfo.apply {
                        if (getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK).any { it.resolveInfo.serviceInfo.packageName == packageName && it.resolveInfo.serviceInfo.name == name && permission == Manifest.permission.BIND_ACCESSIBILITY_SERVICE && it.resolveInfo.serviceInfo.packageName == requireActivity().packageName })
                            isAccessibilityEnabled = true
                    }
                }
            }
            if (isAccessibilityEnabled.not())
                startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).apply {
                    flags = Intent.FLAG_ACTIVITY_NEW_TASK
                })
            return isAccessibilityEnabled
        }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top