11

我正尝试创建一个简单的应用程序,可以从图库应用程序获取图像并将其显示在imageButton上。我正在运行Android 5.0.1的手机上使用API​​ 21进行测试。不幸的是,无论我尝试什么,我都会收到安全错误 - 即使我指定了权限。Android READ_EXTERNAL_STORAGE权限不能正常工作

我为获得检索图像的代码是:

@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> 

我已经在其他帖子上进行了高低搜索,但仍似乎无法弄清楚为什么我仍然得到这个令人讨厌的错误。

+1

阅读本文http://stackoverflow.com/questions/21196453/external-storage-permission-issue-with-mediaprovider-ring-tones或http://stackoverflow.com/questions/19837358/android-kitkat- security -ception-when-trying-to-reading-from-mediastore –

回答

13

问题
你有错误

java.lang.SecurityException异常:权限拒绝:阅读com.android.providers .media.MediaProvider uri content:// media/external/images/media/35634 from pid = 25240,uid = 10070或ntUriPermission()。

原因
你没有给予正确的权限,因为的android:maxSdkVersion="18",它根据文档。

此权限应授予您的应用程序的最高API级别。如果从某个API级别开始不再需要应用程序所需的权限,则设置此属性非常有用。

只要您没有在API 21您的应用程序授予权限的行为确定。

检查this topic了解更多信息。

SOLUTION
如果你想给读取权限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" /> 
+0

我发誓它昨天晚上没有工作,当我尝试没有工具和maxsdk的权限,现在它在协作,就像什么都没有发生过。非常感谢! – Zheryu

+0

很高兴帮助;) –

2

只需使用下面的一个取代和尝试,

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

它不起作用 – Karoly

1

在某些设备上进行调试时,您需要明确授予权限,方法是进入设置 - >应用程序 - > MY_APPLICATION - >权限,然后授予所需权限。