SecurityException:权限拒绝:读取(仅在模拟器上)
SecurityException: Permission Denial: reading (only on emulator)
我的应用程序中有两个活动,MainActivity 调用 ImagePicker,它有一个 GridView 来布置 phone 图库中的所有图像,我在其中使用 ContentResolver 获取光标。
当我测试它时,它在我的 phone 上运行良好,但每次在模拟器上立即崩溃。
这是错误日志:
java.lang.SecurityException: Permission Denial:reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or 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>
您的模拟器 android 是什么版本?你是用 SDK 23 编译的吗?
如果您的模拟器是 Marshmallow,您需要在运行时显式检查权限。这是由于新的权限模型。
查看有关权限的文档以获取更多信息:https://developer.android.com/training/permissions/index.html
如果你的应用程序目标版本是 23 那么它会给你这个错误,如果你的要求包括 API 级别 23 那么你需要制作目标 23 并且需要动态检查权限这里是开发人员的例子网站检查 https://developer.android.com/training/permissions/requesting.html
注意: 即使您将目标设置为 22 或更低,您的应用也可以使用 23 而不会出现此(检查权限)错误。
Before calling method, check for permission.
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();
}
}
Check permission result.
@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;
}
}
我的应用程序中有两个活动,MainActivity 调用 ImagePicker,它有一个 GridView 来布置 phone 图库中的所有图像,我在其中使用 ContentResolver 获取光标。
当我测试它时,它在我的 phone 上运行良好,但每次在模拟器上立即崩溃。
这是错误日志:
java.lang.SecurityException: Permission Denial:reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or 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>
您的模拟器 android 是什么版本?你是用 SDK 23 编译的吗? 如果您的模拟器是 Marshmallow,您需要在运行时显式检查权限。这是由于新的权限模型。
查看有关权限的文档以获取更多信息:https://developer.android.com/training/permissions/index.html
如果你的应用程序目标版本是 23 那么它会给你这个错误,如果你的要求包括 API 级别 23 那么你需要制作目标 23 并且需要动态检查权限这里是开发人员的例子网站检查 https://developer.android.com/training/permissions/requesting.html
注意: 即使您将目标设置为 22 或更低,您的应用也可以使用 23 而不会出现此(检查权限)错误。
Before calling method, check for permission.
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();
}
}
Check permission result.
@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;
}
}