Android API 33 - 如何获取外部存储的读/写权限?

问题描述 投票:0回答:2
我正在努力更新现有的 Android 应用程序。该应用程序提供了将自定义文件(例如 PDF 报告、

no 图像、音频或视频)存储到外部存储“Documents/MyApp/Reports”上的 Documents

 文件夹的功能。此外,应用程序可以从此文件夹中读取任何此类文件,无论它是由应用程序创建
还是由用户上传

虽然现有代码在 API 32 之前运行良好,但在 API 33 上运行时,

不显示文件权限对话框。调用处理程序onRequestPermissionsResult

,无需任何用户交互,并且拒绝所有请求的权限。

正如 @blackapps 所指出的,在 API 33 上,不再需要请求写入和读取文件的权限。虽然应用程序本身创建的文件似乎是这样,但我无法访问用户上传到

Documents/MyApp/Reports

 的任何文件。这些文件根本不包含在
dir.listFiles()
中。

我该如何解决这个问题?


我发现了有关类似问题的其他问题,其中一些链接到有关“

精细媒体权限”的此 API 33 更改。但是,在我的情况下,将 READ_EXTERNAL_STORAGE

 替换为 
READ_MEDIA_IMAGES
READ_MEDIA_VIDEO
READ_MEDIA_AUDIO
 并不是一个好的解决方案,因为在存储自定义非音乐文件时 
Allow XY to access music...
 会产生误导。

此外,将这些权限添加到清单并在应用程序中请求它们不会改变任何内容。用户上传的自定义文件仍然不包含在

dir.listFiles()

中。

添加/请求

MANAGE_EXTERNAL_STORAGE

 权限时也是如此。

如何正确请求自定义/非媒体文件的外部存储使用量?


我的代码:

// AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> ... <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> // SomeActivity.java public class SomeActivity extends NavigationActivity { ... public boolean askForFilePermissions() { if (Build.VERSION.SDK_INT >= 23) { boolean hasPermission = this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (!hasPermission) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1); return true; } } return false; } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! } else { // permission denied, boo! } return; } } } ... }
    
android
2个回答
6
投票
对于 Android 13 设备,您不需要请求写入权限,因为默认情况下您拥有该权限。

因此您的应用程序只需在文档目录和所有其他公共目录中创建文件夹和文件。


0
投票
他没有回答问题,因为我认为他没有读过。我也想知道同样的事情。

© www.soinside.com 2019 - 2024. All rights reserved.