微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android:范围存储将应用程序文件夹从外部目录移动到Android / data / com.myapp

如何解决Android:范围存储将应用程序文件夹从外部目录移动到Android / data / com.myapp

我计划为现有应用程序实现范围存储。我所有的应用程序数据都存储在外部存储器的 storage / emulated / 0 / MyAppName 路径中。我必须将此数据移到 Android / data / com.myapp 之类的私有文件夹中。谁能在这方面提供一些代码段来帮助您?

解决方法

在此SO topic中,您有一些示例如何将文件移动到新目录(简而言之:使用renameTo类中的File方法)

请记住,当您更新targetSdkVersion并“打开”作用域存储时,您将无法访问旧文件夹。带有文件移动摘要的第一个发行版本,让用户运行您的应用一段时间(大多数活动用户会将文件移动到新文件夹),然后发布具有范围存储支持的新应用版本

您必须考虑到,部分用户可能会使用(非常)旧的应用程序,并且某天会直接更新为支持范围存储(targetSdkVersion),他们将丢失数据(上一个文件夹中的文件访问)。更长的时间,您将在市场上移动文件代码的情况下将版本保持在预限定范围内-较小部分的用户将丢失数据

,

您还可以使用特定于应用程序的文件。 首先,让我们考虑您的应用程序ID为com.myapp

现在将以下内容添加到应用程序属性中的清单文件中

<application...>            
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>
  1. 现在转到项目中的res目录,右键单击它并选择new,然后选择Android Resource Directory

  2. 现在选择资源类型为xml,将目录名称输入为xml,并将源设置为main src/main/res

  3. 现在在名称为file_paths的xml文件夹中创建一个新的xml文件

  4. 并在其中写以下内容。

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images"
        path="Android/data/com.myapp/files/Pictures" />
    <external-path name="my_documents"
        path="Android/data/com.myapp/files/Documents" />
    <external-path name="my_videos"
        path="Android/data/com.myapp/files/Movies" />
    </paths>
    

现在要使用它,您可以使用以下代码

private File createImageFile(String fileName) throws IOException {
    File storageDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File imageFile = File.createTempFile(fileName,".jpg",storageDir);
    return imageFile;
}

public Uri getFileUri(String fileName,String imageString) {
    File imageFile = null;
    Uri uri = null;

    try {
        imageFile = createImageFile(fileName);

        imageFile.createNewFile();
        FileOutputStream fo = new FileOutputStream(imageFile.getPath());
        fo.write(imageString.getBytes());
        fo.flush();
        fo.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (imageFile != null) {
        uri = FileProvider.getUriForFile(activity,"com.myapp",imageFile);
    }
    return uri;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?