Android M 用户权限错误 - 读写

标签 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() 

我在 list 中添加用户权限,如

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

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

compileSdkVersion 23
buildToolsVersion "22.0.1"

minSdkVersion 16
targetSdkVersion 23

如何在android M 中读写外部存储?

最佳答案

documentation 读取.我必须在运行时请求用户许可。代码示例:

像我们之前做的那样向 android manifest 添加权限:

<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;
        }
    }
}

I was not able to READ external storage only by asking WRITE permission, so i had to request for Manifest.permission.READ_EXTERNAL_STORAGE as well.


Also if you want to target versions below api 23, check the Build VERSION at runtime with IF statement and ask for permissions only if VERSION is equal or above Android M.

关于Android M 用户权限错误 - 读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175770/

相关文章:

c# - C# 中的 Dictionary.ContainsKey() 未在字典中找到键

java - 具有 Webview 的 IOS 和 Android 应用程序是否仅被视为混合应用程序或 Web 应用程序?

java - 将 Android 数据库用于待办事项列表

java - Android - Activity 堆栈,将当前 Activity 置于最前面并禁用后退键

Android 服务在刷出应用程序时被杀死

java - 在 webapp 中删除文件时 Tomcat 8.5.42 权限被拒绝

bash - 我如何使用 su 作为该用户执行 bash 脚本的其余部分?

android - 来自支持库的 SwipeRefreshLayout。 v21 不适用于静态内容

rest - 更改 Magento 2.1 guest 权限以访问 Web api 目录/产品

javascript - Meteor请求权限