2

Is there any option to check the status of accessibility permission in Android, whether it is granted to the app or not?

I tried both (from this post)

private boolean checkWriteExternalPermission()
{
    String permission =  Manifest.permission.BIND_ACCESSIBILITY_SERVICE;
    int res = getContext().checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);            
}

and

PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(
    android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE, 
    context.getPackageName());
if (hasPerm != PackageManager.PERMISSION_GRANTED) {
   // do stuff
}

but in both cases, the result is negative irrespective of permission status. Even if the service is using the permission, the result is -1.

Please check the comments for the correct answer, as the question can not receive answers while being closed. Thanks to abdu and Duna.

Adinia
  • 3,722
  • 5
  • 40
  • 58
Harsh
  • 363
  • 4
  • 14
  • `ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);` [read](https://developer.android.com/training/permissions/requesting.html) – Pavneet_Singh Oct 16 '17 at 16:10
  • 1
    I have tried this , but it returns -1 irrespective of the status (i used Manifest.permission.BIND_ACCESSIBILITY_SERVICE) – Harsh Nov 03 '17 at 16:38
  • 1
    public static boolean isAccessibilityEnabled(Context context, String id) { AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); List runningServices = am.getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK); for (AccessibilityServiceInfo service : runningServices) { if (id.equals(service.getId())) { return true; } } return false; } – Abdu Sep 18 '18 at 22:50
  • Could you post this as an answer please – Harsh Nov 24 '18 at 22:47
  • 1
    This question should've never been closed. This question is, by no means, related to the linked question. – Muntashir Akon Feb 05 '23 at 02:48

2 Answers2

0

Thanks to Duna and Abdu for the answers they dropped on the comments as the question was closed once.

from the comment posted by Abdu

public static boolean isAccessibilityEnabled(Context context, String id) { 
    AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);    
    List<AccessibilityServiceInfo> runningServices = am.getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK); for         

    (AccessibilityServiceInfo service : runningServices) { 
        if(id.equals(service.getId())) { 
            return true; 
        } 
    } 
        return false; 
    }

and from link provided by Duna
github.com/parthdave93/AccessibilityServiceExample

public static boolean isAccessibilitySettingsOn(Context mContext) {
int accessibilityEnabled = 0;
//your package /   accesibility service path/class
final String service = "com.example.sotsys_014.accessibilityexample/com.accessibilityexample.Service.MyAccessibilityService";

boolean accessibilityFound = false;
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, "***ACCESSIBILIY IS ENABLED*** -----------------");
    String settingValue = Settings.Secure.getString(
            mContext.getApplicationContext().getContentResolver(),
            Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
    if (settingValue != null) {
        TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
        splitter.setString(settingValue);
        while (splitter.hasNext()) {
            String accessabilityService = splitter.next();

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

return accessibilityFound;
}
Harsh
  • 363
  • 4
  • 14
-1

You can use following code for checking the permission status to your app. (here for write permission to external storage).

if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
            {
                //Permission Granted
                Log.v("LOG", "Permission is granted ");
                return true;
            }
            else{
                //Request For Permission
                Log.v("LOG","Permission is Revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }

If the permission is revoked then use this override method

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if(grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            Log.v("LOG", "Permission: " + permissions[0] + "was" + grantResults[0]);
            //resume task needing this permission
        }

    } 
ap14
  • 4,393
  • 1
  • 15
  • 30