SecurityException:权限拒绝:读取(仅在模拟器上)
Posted
技术标签:
【中文标题】SecurityException:权限拒绝:读取(仅在模拟器上)【英文标题】:SecurityException: Permission Denial: reading (only on emulator) 【发布时间】:2015-12-12 11:33:01 【问题描述】:我的应用中有两个活动,MainActivity 调用 ImagePicker,它有一个 GridView 布局手机图库中的所有图像,我使用 ContentResolver 来获取光标。
当我测试它时它在我的手机上运行良好,但每次在模拟器上都会立即崩溃。
这是错误日志:
java.lang.SecurityException: Permission Denial:reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, 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>
【问题讨论】:
在创建模拟器时尝试指定sd卡存储空间。 对不起,我该怎么做?我把它设置为 1G。 【参考方案1】:你的模拟器是什么版本的安卓?您是否使用 SDK 23 进行编译? 如果您的模拟器是 Marshmallow,则需要在运行时显式检查权限。这是由于新的权限模型。
查看有关权限的文档以获取更多信息:https://developer.android.com/training/permissions/index.html
【讨论】:
【参考方案2】:在调用方法之前,检查权限。
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
可以是您想要的任何 int :) 我在应用程序定义的示例中替换为我自己的常量:static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 99;
使用android.Manifest.permission.WRITE_EXTERNAL_STORAGE
而不是Manifest.permission.WRITE_EXTERNAL_STORAGE
【参考方案3】:
如果您的应用目标版本是 23,那么它会给您这个错误,如果您的要求包括 API 级别 23,那么您需要制作目标 23 并且需要动态检查权限这里是来自开发者网站检查的示例https://developer.android.com/training/permissions/requesting.html
注意: 即使您将目标设为 22 或更低,您的应用也可以使用 23 而不会出现此(检查权限)错误。
【讨论】:
以上是关于SecurityException:权限拒绝:读取(仅在模拟器上)的主要内容,如果未能解决你的问题,请参考以下文章
Android - java.lang.SecurityException:权限拒绝:启动意图
Android:java.lang.SecurityException:权限拒绝:启动意图
java.lang.SecurityException:权限拒绝:实现内容提供者时打开提供者
java.lang.SecurityException:权限拒绝:打开提供程序 com.estrongs.android.pop.app.FileContentProvider
java.lang.SecurityException:权限被拒绝:打开提供程序 com.quickblox.q_municate_core.db.DatabaseProvider