Android 奇怪的权限拒绝异常(写入外部存储)

Android 奇怪的权限拒绝异常(写入外部存储),android,android-permissions,Android,Android Permissions,我的manifest.xml如下所示: <?xml version="1.0" encoding="utf-8"?> <manifest package="com.my.app" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORA

我的manifest.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.my.app"
          xmlns:android="http://schemas.android.com/apk/res/android">

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

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
我得到了以下例外:

Failed to insert image
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2574, uid=11336 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
                                                                        at android.os.Parcel.readException(Parcel.java:1627)

为什么??我拥有Androidmanifest文件中定义的权限。

targetSdkVersion 24
降级到
targetSdkVersion 22
或添加权限。请参见

从Android 6.0开始,权限是在运行时请求的,而不是在安装之前

现在,如果需要执行需要权限的操作(在您的情况下,在外部存储器上写入文件),则必须执行以下操作:

//此处,此活动是当前活动
if(ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE\u EXTERNAL\u STORAGE)!=PackageManager.permission\u provided){
//我们应该解释一下吗?
if(ActivityCompat.shouldShowRequestPermissionRegulation(此活动,清单.权限.写入外部存储)){
//向用户显示解释*异步*--不阻止
//此线程正在等待用户的响应!在用户
//请查看说明,然后重试请求权限。
}否则{
//不需要解释,我们可以申请许可。
ActivityCompat.requestPermissions(thisActivity,新字符串[]{Manifest.permission.WRITE\u EXTERNAL\u STORAGE},MY\u PERMISSIONS\u REQUEST\u WRITE\u EXTERNAL\u STORAGE);
//我的\u权限\u请求\u写入\u外部\u存储是一个
//应用程序定义的int常量。回调方法获取
//请求的结果。
}
}
然后,重写``以查看您的用户是否已授予该权限

@覆盖
public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults){
开关(请求代码){
案例我的权限请求写外部存储:{
//如果取消请求,则结果数组为空。
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//许可被授予了,耶!
}否则{
//权限被拒绝,嘘!禁用
//依赖于此权限的功能。
}
返回;
}
//其他“案例”行,用于检查其他
//此应用可能请求的权限
}
}

您可以获得有关新权限模型的更多信息。

r您正在尝试在android 6或更高版本上运行您的应用程序吗?是的,我正在尝试在android 6上运行。即使将targetSdkVersion更改为低于23,我也遇到了相同的错误。(我使用targetSdkVersion 17)在代码中,当显示解释时,为什么
异步地向用户显示解释*
?如果我只是弹出一个对话框向用户解释为什么需要权限,为什么我需要异步弹出对话框?这不是一件长期的事情。我也检查了官方文件,上面写着同样的内容,我想知道我必须遵守吗?
 MediaStore.Images.Media.insertImage(
    getContentResolver(), myView.getDrawingCache(),
    UUID.randomUUID().toString()+".png", "my pic");
Failed to insert image
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2574, uid=11336 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
                                                                        at android.os.Parcel.readException(Parcel.java:1627)