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();
}
}
}
}
ОБНОВИТЬ
Согласно ответу Али, мне нужно отдельно проверить оба разрешения, независимо от того, предоставлены они или нет.Но согласно этому, если какое-либо разрешение в группе разрешений предоставлено, автоматически будет также предоставлено другое разрешение в той же группе. И разрешение на чтение и запись для внешнего хранилища принадлежит той же группе.
2 ответа
Если вы пропустили <uses-permission android:name="com.android.providers.media.MediaProvider"/>
в вашем AndroidManifest.xml, пожалуйста, добавьте его и попробуйте снова.
Все мы знаем, что Android Marshmallow представил разрешения во время выполнения, позволяя пользователю разрешать или запрещать любое разрешение во время выполнения. Реализация разрешений во время выполнения - это утомительный процесс, и разработчик должен написать много кода только для того, чтобы получить одно разрешение.
В этой статье мы собираемся упростить процесс добавления разрешений во время выполнения с помощью библиотеки Dexter. Используя эту библиотеку, разрешения могут быть реализованы за несколько минут.