【问题标题】:How to manage files and folder in Android 11 maintaining backwards-compatibility如何在 Android 11 中管理文件和文件夹以保持向后兼容性
【发布时间】: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 读取和写入的任何位置,这些位置在卸载后仍然存在。

标签: android file


【解决方案1】:

以经典方式将文件写入公共 Documents 文件夹的子目录。

他们会活下来。

但无法通过经典文件方式访问(除非您的应用具有“所有文件访问权限”)但使用 SAF。

【讨论】:

  • 我已经尝试更改文件夹目标,例如。 “donwload”,但是当我从清单 android:requestLegacyExternalStorage 中删除时,不再创建文件夹
  • 您使用的是 Android 11 设备?如果您使用的是 Android 11 设备,则请求旧版外部存储是或否应该无效。
  • eg. "donwload",你的意思是公开的Downloadfolder吗?
  • 抱歉“下载”的拼写错误,是的,我的意思是公共文件夹
  • 你没有纠正我的其他言论:有什么原因吗?
猜你喜欢
  • 2011-02-09
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多