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

Kus*_*rma 12 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() 
Run Code Online (Sandbox Code Playgroud)

我在清单中添加了用户权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

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

compileSdkVersion 23
buildToolsVersion "22.0.1"

minSdkVersion 16
targetSdkVersion 23
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*rma 21

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

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

现在检查用户是否已授予权限或拒绝其@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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我只能通过询问WRITE权限才能读取外部存储空间,因此我也必须要求 Manifest.permission.READ_EXTERNAL_STORAGE.


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


Goo*_*ead 6

如果你正在寻找一种方法来处理任何Android版本(你正在编译M,但有些设备可以使用其他版本),有一个兼容版本.

if (ContextCompat.checkSelfPermission(CreatePlayerActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(CreatePlayerActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(CreatePlayerActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }
Run Code Online (Sandbox Code Playgroud)