android - Marshmallow 中的存储权限错误

标签 android permissions android-6.0-marshmallow

在 Lollipop 中,下载功能在我的应用程序中运行良好,但是当我升级到 Marshmallow 时,当我尝试从互联网下载到 SD 卡时,我的应用程序崩溃并出现此错误:

Neither user  nor current process has android.permission.WRITE_EXTERNAL_STORAGE

它提示这行代码:

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

我在应用程序外部的 list 中拥有权限:

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

我清理并重建了项目,但它仍然崩溃。

最佳答案

您应该通过以下方式检查用户是否已授予外部存储权限:

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.v(TAG,"Permission is granted");
    //File write logic here
    return true;
}

如果没有,您需要请求用户授予您的应用权限:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

当然,这些仅适用于棉花糖设备,因此您需要检查您的应用是否在棉花糖上运行:

 if (Build.VERSION.SDK_INT >= 23) {
      //do your check here
 }

还要确保您的 Activity 实现了 OnRequestPermissionResult

整个权限如下所示:

public  boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {

            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
}

权限结果回调:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
        //resume tasks needing this permission
    }
}

关于android - Marshmallow 中的存储权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33162152/

相关文章:

android,无法在 ListView 的行中右侧对齐图标

sql-server - SQL Server 2008 Express 授予用户权限

安卓6.0权限

android - Android M 上配置文件 GPU 条的颜色

android - 在依赖数组适配器的 ListView 中以编程方式更改文本颜色

android - 如何动态修改来电者姓名

mercurial - 不信任来自不受信任的用户 root、dev 组的文件 .hg/hgrc

android - Android ICS 上的 ACCESS_NETWORK_STATE 权限

android - M 新保护级别列表?

android - 对话框 Activity 中的软键盘平移后面的 Activity