Android 奇怪的权限拒绝异常(写入外部存储)
我的manifest.xml如下所示: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
<?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)