【发布时间】:2021-04-16 08:43:50
【问题描述】:
我需要使我的应用程序与大于 29 (Android 11+) 的 android 版本兼容。 目前我使用以下代码创建一个文件夹树:
public void createFolder() {
try {
ArrayList<File> listDir = new ArrayList<>();
listDir.add(new File(MAIN_FOLDER));
listDir.add(new File(CONFIG_FOLDER_ROOT));
listDir.add(new File(PDF_FOLDER));
listDir.add(new File(THUMB_FOLDER));
listDir.add(new File(LOGS_FOLDER));
listDir.add(new File(ARCHIVE_FOLDER));
listDir.add(new File(ZOMBIE_FOLDER));
listDir.add(new File(DATASHEET_FOLDER));
for (int i = 0; i < listDir.size(); i++) {
if (!listDir.get(i).exists()) {
if (listDir.get(i).mkdirs()) {
//Creo il file .incarichi
if (listDir.get(i).getName().compareToIgnoreCase(".Data") == 0) {
File fileIncarichi = new File(listDir.get(i).getAbsolutePath(), ASSIGNMENT_FILE);
if (!fileIncarichi.exists()) {
fileIncarichi.createNewFile();
}
}
//Creo il file .warning
if (listDir.get(i).getName().compareToIgnoreCase(".Logs") == 0) {
File fileIncarichi = new File(listDir.get(i).getAbsolutePath(), WARNING_FILE);
if (!fileIncarichi.exists()) {
fileIncarichi.createNewFile();
}
File fileConfig = new File(listDir.get(i).getAbsolutePath(), CONFIG_FILE);
if (!fileConfig.exists()) {
fileConfig.createNewFile();
}
}
//Creo i file .nomedia
File fileMedia = new File(listDir.get(i).getAbsolutePath(), ".nomedia");
if (!fileMedia.exists()) {
fileMedia.createNewFile();
}
}
}
}
} catch (Exception e) {
wil.WriteFile("1)FilesUtilities - Exception: " + e.getMessage());
}
}
这些是我传递给“newFile()”函数的变量示例:
public final static String MAIN_FOLDER = Environment.getExternalStorageDirectory() + "/.MYAPP";
public final static String THUMB_FOLDER = Environment.getExternalStorageDirectory() + "/.MYAPP/.Thumbs";
为了保持与我在清单中插入的新 android 版本的兼容性,现在一切正常:
android:requestLegacyExternalStorage="true"
我通过 Play 商店收到通知,说我必须在 5 月 5 日之前调整我的应用程序以使其符合新政策,因此我开始阅读如何使应用程序与所有版本的 android 兼容,但我对如何进行有一些疑问。
请记住,我无法创建“自定义”文件夹,是否可以直接在公共文件夹中创建我的目录,例如“下载,文档”,或者是否有必要完全更改创建和访问文件的过程“媒体商店”还是“商店访问框架”?
【问题讨论】:
-
为什么不在
Context上使用getExternalFilesDir()作为您的根? -
“我需要应用程序创建的文件即使在卸载应用程序后也能“存活””——为什么?您正在积极尝试对用户隐藏它们。为什么用户在卸载您的应用程序后希望保留一堆隐藏文件?
-
对,缺少前提。我正在开发的这个应用程序是针对私人受众的,特别是针对使用公司自有设备的公司用户。应用程序负责文档的生成,如果在文件发送到服务器之前卸载应用程序,则必须能够手动恢复它们
-
Android 不是为您的场景设计的。对您和您的受众有益的东西不一定对其余 25 亿 Android 设备用户有益。如果您的应用程序恰好是设备管理员或设备所有者应用程序,则可能还有其他存储选项,尽管我不知道。我不知道您的应用程序可以使用文件系统 API 读取和写入的任何位置,这些位置在卸载后仍然存在。
-
"是否有必要调整代码,因为它不再可能在清单中设置它 requestLegacyExternalStorage = true" -- 正确。 AFAIK,您有必要调整您的代码。我不知道您的应用程序可以使用文件系统 API 读取和写入的任何位置,这些位置在卸载后仍然存在。