Отказ в разрешении: требуется android.permission.READ_EXTERNAL_STORAGE или GrantUriPermission() (API 23)

Я пытаюсь запросить разрешения пользователя во время выполнения. API 23 и я хочу подобрать изображение из галереи телефона. Следуя некоторым фрагментам, это код, который у меня есть до сих пор:

В onCreate() действия я проверяю:

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

Затем я переопределяю:

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

Но я все еще не могу заставить приложение работать на AVD.

РЕДАКТИРОВАТЬ: Разрешения в манифесте:

<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" />

person user6456773    schedule 10.10.2016    source источник
comment
добавьте разрешение на ваш файл манифеста .....   -  person sushildlh    schedule 10.10.2016
comment
Они у меня есть, обновил свой вопрос выше.   -  person user6456773    schedule 10.10.2016


Ответы (4)


В зависимости от того, как вы структурировали свой оператор if, вы будете запрашивать разрешения пользователя только в том случае, если они уже предоставлены. Добавьте блок else следующим образом:

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

Редактировать

Обобщите свой user-permission в манифесте (без суффикса -sdk-23), чтобы его можно было использовать на разных и будущих уровнях API:

<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" />
person Matei Radu    schedule 10.10.2016
comment
Большое спасибо! Работает идеально! - person user6456773; 10.10.2016

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

просто сделает это. обратите внимание на targetSdkVersion 22

person android_griezmann    schedule 10.10.2016

вы проверяете разрешение, как показано ниже

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

        }
    }
}
person Arti    schedule 10.10.2016

Ссылка на класс разрешений ниже: -

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

создайте класс Sperate и вызовите

PermissionClass.checkAndRequestPermissions(this);

// если фрагмент, то заменить this на getActivity()

он автоматически получает разрешение

person Community    schedule 04.06.2018