Android Oreo(写入外部存储)权限

Android Oreo(写入外部存储)权限,android,permissions,Android,Permissions,据 现在,我有了READ_EXTERNAL_存储器,我请求DownloadManager在公共下载文件夹中下载一个文件 downloadRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, mAttachmentItem.getFilename()); 不幸的是,我 E/UncaughtException: java.lang.IllegalStateException: Unable to cre

现在,我有了READ_EXTERNAL_存储器,我请求DownloadManager在公共下载文件夹中下载一个文件

downloadRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, mAttachmentItem.getFilename());
不幸的是,我

E/UncaughtException: java.lang.IllegalStateException: Unable to create directory: /storage/emulated/0/data/user/0/com.abc.cba/files
                                                                           at android.app.DownloadManager$Request.setDestinationInExternalPublicDir(DownloadManager.java:699)
我已在清单中声明了这两个权限

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

您必须在运行时授予对棉花糖或更高版本的权限。 示例代码段:

private static final int REQUEST\u WRITE\u STORAGE=112

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            boolean hasPermission = (ContextCompat.checkSelfPermission(getBaseContext(),
                    Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
            if (!hasPermission) {
                ActivityCompat.requestPermissions(SplashScreen.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS, Manifest.permission.INTERNET
                        },
                        REQUEST_WRITE_STORAGE);
            }else{ startMainActivity(); }
        }

希望有帮助。

事实上,这是一个外部问题。我正在使用的一个应用程序库请求android的WRITE_EXTERNAL_权限:maxSdkVersion。因此,当与我的清单合并时,它将删除整个应用程序的权限

解决方案是添加:

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

对于奥利奥

即使您已经请求并被授予写入外部存储权限,您也需要显式执行读取外部存储请求(通过代码),反之亦然

在此之前,当授予写外部存储时,会自动授予读外部存储

所以你需要做的是

1) 请求在代码中写入权限

2) 当用户授予写入权限时,再次请求读取权限-这将被自动授予(如果您没有明确请求读取权限,则会出现异常)

奥利奥的变化对我来说没有多大意义(不知道为什么我们需要申请自动授予的许可),但事实就是这样


将权限添加到清单中是正确的:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我在活动的
onCreate
中调用此方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Other things
    requestAppPermissions();
}
在第一次加载时,这将提示用户接受权限


然后,在运行任何需要读写存储器的代码之前,可以通过存储值或使用方法
hasreadpowpermissions()
hasritepermissions()再次运行这些检查来检查这些权限
以上定义。

只是一个通知:在Android p上,我必须向要求重新启动应用程序的用户显示一个终止对话框,因为即使在上面写了所有内容后,应用程序也无法读取外部存储,只有在重新启动后。说真的,谷歌的那些家伙每次都让安卓变得更好。6,8,现在9有这么多麻烦,再更新一次这样愚蠢的更新,我将转到iOS:)

更新:查看以获得更好的解决方案


编辑:这不是一个解决方案,只是一个快速解决方法。 如果您获得权限被拒绝错误,即使已授予权限并且您已经执行了权限检查

确保您的目标不是api级别29: 将targetSdkVersion和compilesdkversion从29更改为28或任何其他更低级别。

使用此选项

而不是


您需要在运行时请求
WRITE_EXTERNAL_STORAGE
。我在运行时请求WRITE_EXTERNAL_STORAGE权限,系统不会提示任何消息或对话框,在“onRequestPermissionsResult”中总是被拒绝(未授予)请尝试完全卸载并重新安装您的应用程序。另外,确保
元素位于正确的位置(作为
的直接子元素)。它们位于正确的位置location@svkaka:您是否尝试在清单文件(在使用权限中)中设置
tools:node=“replace”
,这个解决方案奏效了。权限声明更严格的库覆盖主应用程序限制更少的权限声明的速度很快,这是一个概念错误imho。当我要求先写时,我总是得到-1@svkaka,我认为一般的想法是只有在你需要的时候才请求许可(例如,只有当用户单击“拍照”按钮时,才提示输入相机/写入权限,而不是在用户打开应用程序时立即询问。“对于棒棒糖和更高版本,您还需要在运行时请求权限”不。运行时权限模型是在Marshmallow(API 23)中引入的这不是一个解决方案——不是针对最新的API吗?请考虑如何在API 29中正确地实现这一点。这不是正确的答案,只是忽略了问题。这是WOWS,但是为什么??代码:> Android:RealestReCyAyExalStale=“true”< /Cord>这在Android 9中修复了我的问题:谢谢!
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
private void requestAppPermissions() {
    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return;
    }

    if (hasReadPermissions() && hasWritePermissions()) {
        return;
    }

    ActivityCompat.requestPermissions(this,
            new String[] {
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            }, REQUEST_WRITE_STORAGE_REQUEST_CODE); // your request code
}

private boolean hasReadPermissions() {
    return (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
}

private boolean hasWritePermissions() {
    return (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Other things
    requestAppPermissions();
}