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;
}
}
}
...
}
因此您的应用程序只需在文档目录和所有其他公共目录中创建文件夹和文件。