hongyangAndroid / wanandroid

玩Android网站 -- 努力做一个优质的Android站点
http://www.wanandroid.com/
Apache License 2.0
583 stars 55 forks source link

已经动态申请权限,但是还会遇到Permission Denial #243

Closed Yuelinghui closed 4 years ago

Yuelinghui commented 4 years ago

在一个Activity的onCreate()里去动态申请权限,但是从Crash里还能找到Permission Denial

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] permissions = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList permissionRequests = new ArrayList<>(); for (String permission : permissions) { if (PermissionChecker.checkSelfPermission(this, permission) != PermissionChecker.PERMISSION_GRANTED) { permissionRequests.add(permission); } } if (permissionRequests.size() > 0) { requestPermissions(permissionRequests.toArray(new String[]{}), REQUESTCODE); return; } } // 后续操作 }

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(REQUESTCODE == requestCode) { for (int grantResult : grantResults) { if (grantResult != PermissionChecker.PERMISSION_GRANTED) { // finish这个Activity return; } } //后续操作 } }

后续操作是读取用户的相册里的照片,然后自己展示出来,相当于自己做了一个自定义的相册

但是我们从Crash反馈中发现,还是会出现Permission Denial的错误,而且错误就是没有授予权限就去读取一个URI的错误。

java.lang.RuntimeException: An error occurred while executing doInBackground() at android.support.v4.content.n$3.done(ModernAsyncTask.java:161) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) at java.util.concurrent.FutureTask.setException(FutureTask.java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=30151, uid=10151 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() at android.os.Parcel.createException(Parcel.java:1966) at android.os.Parcel.readException(Parcel.java:1934) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) at android.content.ContentProviderProxy.query(ContentProviderNative.java:418) at android.content.ContentResolver.query(ContentResolver.java:822) at android.content.ContentResolver.query(ContentResolver.java:771) at android.support.v4.content.e.a(ContentResolverCompat.java:80) at android.support.v4.content.g.d(CursorLoader.java:59) at android.support.v4.content.g.b(CursorLoader.java:37) at android.support.v4.content.b$a.a(AsyncTaskLoader.java:1302) at android.support.v4.content.b$a.a(AsyncTaskLoader.java:45) at android.support.v4.content.n$2.call(ModernAsyncTask.java:138) at java.util.concurrent.FutureTask.run(FutureTask.java:266) ... 3 more

有没有大神能帮忙分析一下

Yuelinghui commented 4 years ago

而且大部分手机是OPPO的8.1.0版本的机型