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中声明的主要内容,如果未能解决你的问题,请参考以下文章

Wifi连接与使用

即使在清单中添加 WRITE_SECURE_SETTINGS 权限错误

Android kotlin:即使在授予权限后也获得 EACCES(权限被拒绝)

Android 动态申请权限

即使设置了权限,也无法写入 Android 外部存储

即使应用程序在android中关闭,如何在服务应该工作时添加位置权限?