安全异常:权限拒绝:读取(仅限模拟器)

19

我的应用有两个活动,MainActivity调用ImagePicker,其中有一个网格视图显示了手机相册中的所有图片,在这里我使用ContentResolver获取光标。

在我的手机上测试时它运行得很好,但在模拟器上每次都会立即崩溃。

以下是错误日志:

java.lang.SecurityException: 拒绝权限:从pid=5934,uid=10060读取com.android.providers.media.MediaProvider uri内容://media/external/images/media需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission()

我的manifest文件中已经写了所需的权限,请参见以下内容:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".ImagePicker" />
</application>

在创建模拟器时,尝试指定SD卡存储空间。 - userDroid
抱歉,我该怎么做?我将其设置为1G。 - TPWang
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
23
你的模拟器使用的是哪个Android版本?你是否使用SDK 23进行编译? 如果你的模拟器是Marshmallow版本,则需要在运行时显式检查权限。这是由于新的权限模型引起的。 更多权限相关信息,请查看文档:https://developer.android.com/training/permissions/index.html

17
在调用方法之前,请检查权限。
private void checkPermission(){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {     
         ActivityCompat.requestPermissions(         
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {    
         callMethod(); 
    }
}

检查权限结果。

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

            case Constants.WRITE_EXTERNAL_STORAGE:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    callMethod(); 
                }
                break;

            default:
                break;
        }
    }

Constants.WRITE_EXTERNAL_STORAGE can be any int you want :) I replaced by my own constant in app-defined example: static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99; - CGR
请使用android.Manifest.permission.WRITE_EXTERNAL_STORAGE代替Manifest.permission.WRITE_EXTERNAL_STORAGE - Souradeep Nanda

3
如果您的应用程序目标版本是23,则会出现此错误。如果您的要求包括API级别23,则需要将目标设置为23并在此处动态检查权限,以下是来自开发者网站的示例,请参见https://developer.android.com/training/permissions/requesting.html 注意:即使您的目标为22或更低版本,您的应用程序也将在23上运行,而不会出现此(检查权限)错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,