Android权限错误即使在manifest.xml中声明
Posted
技术标签:
【中文标题】Android权限错误即使在manifest.xml中声明【英文标题】:Android Permission Error Even with declaration in manifest.xml 【发布时间】:2016-05-28 12:14:06 【问题描述】:我正在尝试打开一个意图以从 android 库中选择一张照片,然后在父活动中使用所选图像设置一个图像视图。我可以打开画廊并选择图像,但随后父活动在 onActivityResult() 方法中崩溃。崩溃发生在 Cursor 实例化行中。
<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
Result 方法上的父 Activity
Uri selectedImage = data.getData();
if(!isExternalStorageReadable())
Log.d("NAMSD", "SS");
else
Log.d("hey", selectedImage.toString());
String[] filePathColumn = MediaStore.Images.Media.DATA;
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Bitmap imageBitmap = BitmapFactory.decodeFile(picturePath);
photo.setImageBitmap(imageBitmap);
附加跟踪:
02-16 16:09:54.108 1803-1815/? E/DatabaseUtils:将异常写入包裹 java.lang.SecurityException:权限拒绝:从 pid=8382、uid=10057 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media/37 需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission () 在 android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 在 android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 在 android.content.ContentProvider$Transport.query(ContentProvider.java:211) 在 android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 在 android.os.Binder.execTransact(Binder.java:453) 02-16 16:09:54.108 8382-8382/? D/AndroidRuntime:关闭虚拟机 02-16 16:09:54.109 8382-8382/? E/AndroidRuntime: 致命异常: main 进程:io.github.getExposure,PID:8382 java.lang.RuntimeException:将结果 ResultInfowho=null, request=3, result=-1, data=Intent dat=content://media/external/images/media/37 传递给活动 io. github.getExposure/io.github.getExposure.PostViewActivity:java.lang.SecurityException:权限拒绝:从 pid=8382 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media/37 , uid=10057 需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission() 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3699) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.SecurityException: Permission Denial: 从 pid=8382 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media/37, uid=10057 需要 android.permission.READ_EXTERNAL_STORAGE , 或 grantUriPermission() 在 android.os.Parcel.readException(Parcel.java:1599) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 在 android.content.ContentResolver.query(ContentResolver.java:491) 在 android.content.ContentResolver.query(ContentResolver.java:434) 在 io.github.getExposure.PostViewActivity.onActivityResult(PostViewActivity.java:135) 在 android.app.Activity.dispatchActivityResult(Activity.java:6428) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
【问题讨论】:
你的应用目标是 23 吗? 【参考方案1】:问题不清楚,但我怀疑你是用 android-23 API (Marshmallow) 编译的,它引入了在使用时询问用户许可的新方法,所以有两种选择
-
(推荐)在使用之前请用户获得该权限。更多信息
here。
(不推荐)将您的目标 API 更改为 Marshmallow 之前的版本,这将恢复为询问应用程序安装所有权限的旧方式。
【讨论】:
【参考方案2】: permissions = new String[2];
permissions[0] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
permissions[1] = Manifest.permission.READ_EXTERNAL_STORAGE;
ActivityCompat.requestPermissions(
this,
permissions,
5
);
由于 android marshmallow,我只需要在我的活动中明确请求读取/写入外部存储的权限。
【讨论】:
以上是关于Android权限错误即使在manifest.xml中声明的主要内容,如果未能解决你的问题,请参考以下文章
即使在清单中添加 WRITE_SECURE_SETTINGS 权限错误