Permission Denial: requires android.permission.REA

2019-02-19 04:58发布

问题:

I am trying to request user permissions at runtime. The API is 23 and I want to pick up an image from the phone's gallery. Following some snippets, this is the code I have so far:

In the onCreate() of the Activity I check:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
            PackageManager.PERMISSION_GRANTED) {
        imageUploader5.setEnabled(true);
        ActivityCompat.requestPermissions(this, new String[]
                { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
    }

Then I override:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 0) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
            imageUploader5.setEnabled(true);
        }
    }
}

But I still cannot make the app to run on the AVD.

EDIT: Permissions in the manifest:

<uses-permission-sdk-23 android:name="android.permission.CAMERA" />
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE" />

回答1:

By how you structured your if state you will ask for user permissions only if they are already granted. Add an else as follow:

// Enable if permission granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
        PackageManager.PERMISSION_GRANTED) {
    imageUploader5.setEnabled(true);
} 
// Else ask for permission
else {
    ActivityCompat.requestPermissions(this, new String[]
            { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}

Edit

Generalize your user-permission in the manifest so it can be used by different and future API levels:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


回答2:

defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 11
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}

will just do it. note the targetSdkVersion 22



回答3:

you check permission as below

public static int REQUEST_STORAGE_PERMISSION = 122;

 if (checkStoragePermission()) {
      imageUploader5.setEnabled(true);
  } else {
       requestStoragePermission();
  }



 private boolean checkStoragePermission() {
    return ActivityCompat.checkSelfPermission(RegisterActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}

private void requestStoragePermission() {
    ActivityCompat.requestPermissions(RegisterActivity.this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_STORAGE_PERMISSION);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_STORAGE_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            imageUploader5.setEnabled(true);
        } else {
            imageUploader5.setEnabled(false);

        }
    }
}


回答4:

The Permission Class link below:-

https://jeeteshsurana.blogspot.com/2017/07/permission-class-pass-activity.html

create Sperate class and call

PermissionClass.checkAndRequestPermissions(this);

// if fragment then replace this to getActivity()

it automatically getting permission