Android M - failed to check runtime permission

2019-02-15 03:35发布

I have just started working with runtime permissions on Android M. I have CAMERA, READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE declared in AndroidManifest.xml

The thing is if user go to Settings and explicitly turn off permissions as below, I cannot check if my app that has Camera or Storage permissions enabled or not

enter image description here

I used this snippet to check if my app has a particular permission or not:

public static boolean hasPermission(Context c, String permission) {
    if (Build.VERSION.SDK_INT >= 23) {
        return ContextCompat.checkSelfPermission(c, permission) == PackageManager.PERMISSION_GRANTED;
    }
    return true;
}

Surprisingly, every check with Camera and Storage permissions returns true (granted) even I turned them off in my Settings.

My targetSdkVersion is 23

Is this expected behavior provided by Google? I looked around the web and still could not find any documentation say anything about handle explicitly-invoked permissions.

4条回答
我想做一个坏孩纸
2楼-- · 2019-02-15 03:37

Again check for permission in onRestart().

@TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onRestart() {
        super.onRestart();
        checkForPermission();
    }


@TargetApi(Build.VERSION_CODES.M)
    private void checkForPermission() {
        int permissionCheck = checkSelfPermission(Manifest.permission.READ_CONTACTS);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "Granted");
        } else {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)) {
                Log.d(TAG, "Contacts Permission Required!!");
                createSnackbar("Contacts Permission Required!!", "Try Again");
            }
            ActivityCompat.
                    requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CONTACT);

        }
    }

Check out this link for further information: https://github.com/sagarjogadia28/PermissionSample/

查看更多
相关推荐>>
3楼-- · 2019-02-15 03:48

You have to change the targetSDKVersion because

You're supposed to get PERMISSION_GRANTED for any targetSdkVersion below 23, even if the user toggled off that permission group in Settings. I suggest that you uninstall the app completely, set your targetSdkVersion to 23, and try it again.

you can check this link

查看更多
做自己的国王
4楼-- · 2019-02-15 03:50

add this in your onCreate method of activity :-

if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    0);

        }
    }

and override this method :-

@Override

public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 0: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}
查看更多
一夜七次
5楼-- · 2019-02-15 03:53

You need to do different things.

First, ask for permission what you are trying to perform. Example camera:

//This is a class variable
private final static int MY_PERMISSIONS_REQUEST_CAMERA = 1;

...

// before use camera:
// check permissions for CAMERA
if (ContextCompat.checkSelfPermission(ActivityName.this,
        Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {

    //request permission
    ActivityCompat.requestPermissions(ActivityName.this,
            new String[]{Manifest.permission.CAMERA},
            MY_PERMISSIONS_REQUEST_CAMERA);

} else {
    //permissions granted, do wahtever with camera
    functionToHandleCamera();
}

Then you need to handle the user response: allow or deny. So Override onRequestPermissionsResult method

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //permissions granted, do wahtever with camera
                functionToHandleCamera();

            } else {
                // permission denied
                Toast msg = Toast.makeText(this, "PERMISSIONS NEEDED", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.CENTER, 0, 0);
                msg.show();
            }
            return;
        }

    }
}

More info: https://developer.android.com/training/permissions/requesting.html

EDIT: if you only want to check if the permission is granted or not, you onlu need the first part of the code I've wrote.

查看更多
登录 后发表回答