[英]Android READ_EXTERNAL_STORAGE permission not working
我正在尝试创建一个简单的应用程序,该应用程序可以从 Gallery 应用程序获取图像并将其显示在 imageButton 上。 我正在运行 Android 5.0.1 的手机上使用 API 21 进行测试。 不幸的是,无论我尝试什么,我都会收到安全错误 - 即使我指定了权限。
我检索图像的代码是:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode){
case PICK_IMAGE_REQUEST:
if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) {
Uri uri = imageReturnedIntent.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
// Log.d(TAG, String.valueOf(bitmap));
ImageButton ib = (ImageButton) findViewById(R.id.inputImg);
ib.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
当我尝试从 Dropbox 选择图像时,该代码有效,但是当我从图库中选择图像时,我得到
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
我将 READ_EXTERNAL_STORAGE 的使用权限标记设为清单的子项:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="[REDACTED]">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<uses-permission tools:node="replace" android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<application>
[REDACTED]
</application>
</manifest>
我在其他帖子上搜索了高低,但似乎仍然无法弄清楚为什么我仍然遇到这个讨厌的错误。
问题
你有错误
java.lang.SecurityException: Permission Denial: 从 pid=25240, uid=10070 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media/35634需要 android.permission.READ_EXTERNAL_STORAGE ,或grantUriPermission()。
原因
由于android:maxSdkVersion="18"
,您没有给予正确的权限,根据文档。
应向您的应用授予此权限的最高 API 级别。 如果从某个 API 级别开始不再需要您的应用所需的权限,则设置此属性很有用。
只要您没有授予API 21
权限,您的应用就可以正常运行。
查看此主题以获取更多信息。
解决方案
如果您想在API 21
下授予读取权限,则必须将它们声明为:
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="21" />
重要的:
这仅在您需要授予额外权限时才有意义,因为某些旧 api 需要新版本不需要的权限,因此用户体验得到改善,因为您只在需要时请求某些权限。
所以(在这种情况下)正确的方法是:
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
添加在
如果要保存数据,则必须添加WRITE_EXTERNAL_STORAGE
权限。
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
只需用下面的替换并尝试,
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在某些设备上进行调试时,您需要通过转到设置 --> 应用程序 --> MY_APPLICATION --> 权限,然后授予所需权限来明确授予权限。
除了在 AndroidManifest.xml 中添加以下内容
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我们还需要在 Activity 中请求应用程序实际访问外部存储的权限。 https://developer.android.com/training/permissions/requesting.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.