Android M用户权限错误 - 读取和写入

时间:2015-08-24 06:32:03

标签: android user-permissions

我刚开始使用android M而我无法访问外部存储空间。我收到以下错误

Caused by: java.lang.SecurityException: Permission Denial: reading 
com.android.providers.media.MediaProvider uri 
content://media/external/images/media from pid=15355, uid=10053 requires 
android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 

我在清单中添加用户权限,如

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

我的构建文件有以下设置:

compileSdkVersion 23
buildToolsVersion "22.0.1"

minSdkVersion 16
targetSdkVersion 23

如何从android M中的外部存储读取和写入?

5 个答案:

答案 0 :(得分:21)

阅读documentation。我必须在运行时询问用户的权限。代码示例:

像我们之前做的那样为Android清单添加权限:

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

检查用户是否已授予权限。如果是,请跳过请求许可并继续您的工作流程,否则请求用户许可:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.System.canWrite(this)) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE}, 2909);
    } else {
        // continue with your code
    }
} else {
    // continue with your code
}

现在检查用户是否已授予权限或拒绝其@Override OnRequestPermissionResult以获得回调:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 2909: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("Permission", "Granted");
            } else {
                Log.e("Permission", "Denied");
            }
            return;
        }
    }
}
  

我只能通过询问WRITE才能读取外部存储空间   许可,所以我不得不要求   Manifest.permission.READ_EXTERNAL_STORAGE也是如此。

  

此外,如果您想要定位api 23以下的版本,请检查Build   VERSION在运行时使用IF语句并仅在请求权限时才使用   VERSION等于或高于Android M

答案 1 :(得分:6)

如果您正在寻找在任何Android版本中处理的方法(您正在为M编译,但某些设备可能正在使用其他版本),则存在兼容版本。

List

答案 2 :(得分:2)

关于所选答案:

Settings.System.canWrite(this)WRITE_EXTERNAL_STORAGE是两个非常不同的东西!应该是:

    boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED;

    boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED;

    if (needsRead || needsWrite)
        requestStoragePermission()

答案 3 :(得分:1)

我正在努力获得WRITE_EXTERNAL_STORAGE权限:在我提出请求后,对话框没有显示并立即返回DENIED

问题出在其中一个包含的库中。它在AndroidManifest.xml中包含相同的权限声明,但maxSdkVersion="22"包含相同的权限声明。应用程序的清单文件中的声明被库重写。

要覆盖库中的权限,我使用了以下内容:

  <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:node="remove"
    tools:selector="com.example.lib" />

我希望这可能会有所帮助。

答案 4 :(得分:-1)

我在github上使用了这个实用程序。它适用于API 22和23.添加运行时权限并不难,但必须分离代码并移动方法来捕获回调有点痛苦。这个库提供了一个链式api来完成支持运行时权限所需的所有操作。

https://github.com/kayvannj/PermissionUtil