SecurityException: отказ в разрешении, даже когда я получаю разрешение во время выполнения

Я получаю исключение ниже на Crashlytics с нескольких устройств с Android 7.0-

Caused by java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/video/media from pid=7070, uid=12033 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
       at android.os.Parcel.readException(Parcel.java:1684)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
       at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
       at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
       at android.content.ContentResolver.query(ContentResolver.java:532)
       at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
       at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
       at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
       at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
       at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
       at android.os.AsyncTask$2.call(AsyncTask.java:305)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:761)

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

  uploadVideo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (Build.VERSION.SDK_INT >= 23)
                        getPermission();
                    else
                        uploadVideo();

                }
            });


private void getPermission() {
        String[] params = null;
        String writeExternalStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE;
        String readExternalStorage = Manifest.permission.READ_EXTERNAL_STORAGE;

        int hasWriteExternalStoragePermission = ActivityCompat.checkSelfPermission(this, writeExternalStorage);
        int hasReadExternalStoragePermission = ActivityCompat.checkSelfPermission(this, readExternalStorage);
        List<String> permissions = new ArrayList<String>();

        if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED)
            permissions.add(writeExternalStorage);
        if (hasReadExternalStoragePermission != PackageManager.PERMISSION_GRANTED)
            permissions.add(readExternalStorage);

        if (!permissions.isEmpty()) {
            params = permissions.toArray(new String[permissions.size()]);
        }
        if (params != null && params.length > 0) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    params,
                    100);
        } else
            uploadVideo();
    }

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 100: {

                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    uploadVideo();
                }
            }
  }
}

ОБНОВЛЕНИЕ

Согласно ответу Али, мне нужно отдельно проверить оба разрешения, предоставлены они или нет. Но согласно это, если предоставлено какое-либо разрешение в группе разрешений, другое разрешение в той же группе также будет предоставлено автоматически. И разрешение на чтение и запись во внешнее хранилище принадлежит той же группе.


comment
почему бы не запросить оба разрешения отдельно с другим кодом запроса   -  person Ali Ahmed    schedule 03.11.2018
comment
ваш код вызывает uploadVideo() дважды. один раз, когда вы предоставляете разрешение на запись, а затем после предоставления разрешения на чтение. Возможно, это было причиной проблемы.   -  person Ali Ahmed    schedule 03.11.2018
comment
Поскольку это сбой, я предполагаю, что вы не можете воспроизвести проблему локально. В этом случае было бы лучше, если бы вы могли опубликовать код для uploadVideo() и любой другой код, который может вызывать его, из-за возможности того, что uploadVideo() вызывается неочевидным способом (тот, который пропускает проверку разрешений). Также хочу посмотреть, как вы справляетесь с этим AsyncTask.   -  person greeble31    schedule 03.11.2018
comment
опубликуйте код метода uploadVideo, пожалуйста.   -  person aolphn    schedule 03.11.2018


Ответы (1)


Если вы пропустили <uses-permission android:name="com.android.providers.media.MediaProvider"/> в своем AndroidManifest.xml, добавьте его и повторите попытку.

person aolphn    schedule 03.11.2018