SecurityException:Permission Denial:读取(仅在模拟器上)

TPW*_*ang 19 permissions android android-emulator android-external-storage android-developer-api

我的应用程序中有两个活动,MainActivity调用ImagePicker,它有一个GridView布局电话库中的所有图像,我使用ContentResolver来获取光标.

当我测试它时,它在我的手机上工作正常,但每次在模拟器上立即崩溃.

这是错误日志:

java.lang.SecurityException:Permission Denial:从pid = 5934读取com.android.providers.media.MediaProvider uri content:// media/external/images/media,uid = 10060需要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>
Run Code Online (Sandbox Code Playgroud)

rig*_*roo 23

什么版本的android是你的模拟器?你正在编译SDK 23吗?如果您的模拟器是Marshmallow,则需要在运行时明确检查权限.这是由于新的权限模型.

查看有关权限的文档以获取更多信息:https://developer.android.com/training/permissions/index.html


Phi*_*ert 16

在调用方法之前,请检查权限.

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(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

检查权限结果.

    @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;
        }
    }
Run Code Online (Sandbox Code Playgroud)