如何在多个版本的Android上正确访问大型应用程序专用数据的外部存储
我已经断断续续地为这个问题挣扎了好几个月,谷歌似乎只是想通过每五分钟改变一次整个事情的运作方式,让每个人都尽可能地难受,而网上的信息是分散的、不连贯的、自相矛盾的。我希望这里有人能理解这一点来帮助我 我有一个应用程序,允许用户对存储在设备本身上的相当大(~4GB)的数据源执行脱机地址检查。此数据在技术上是应用程序私有的,其他应用程序不应访问此数据(尽管这不是主要问题)。由于数据量很大,我一直避免使用内部私有存储,这让我陷入了Android外部存储管理的混乱。我曾读到,Android 4.4中的系统发生了变化,应用程序无法写入SD卡,除非在其特定于软件包的目录中。然而,Android似乎从来没有为我创建过这个目录,也不允许我的应用程序创建这个目录。我被迫将SD卡安装到笔记本电脑上,并手动创建软件包目录!这不是我期望最终用户做的事情,所以我的第一个问题是如何/何时在SD卡上创建特定于包的目录 现在我发现Android 5、6和7的情况又发生了变化,我感到非常困惑。官方文档介绍了如何使用GetExternalFileDirs()获取外部存储位置数组。那我怎么知道该用哪一个呢?我的应用程序甚至可以访问这些位置吗?安卓似乎还没有为第三方应用程序需要大量私有存储做好准备 我还读到,从Android 5开始,我需要使用存储访问框架写入SD卡,让用户选择目录授予权限 这一切似乎荒谬地没有必要。我想做的就是让我的应用程序能够在没有太多用户输入的情况下(最终用户甚至不需要具备基本的技术知识)顺利地将4GB的私人数据读/写到设备上的某个地方,并让它在大多数设备上工作。不同的制造商拥有不同的存储选项,再加上安卓烦人地试图将美国开发者与文件系统分开,这使得这个简单的任务变成了一场噩梦如何在多个版本的Android上正确访问大型应用程序专用数据的外部存储,android,Android,我已经断断续续地为这个问题挣扎了好几个月,谷歌似乎只是想通过每五分钟改变一次整个事情的运作方式,让每个人都尽可能地难受,而网上的信息是分散的、不连贯的、自相矛盾的。我希望这里有人能理解这一点来帮助我 我有一个应用程序,允许用户对存储在设备本身上的相当大(~4GB)的数据源执行脱机地址检查。此数据在技术上是应用程序私有的,其他应用程序不应访问此数据(尽管这不是主要问题)。由于数据量很大,我一直避免使用内部私有存储,这让我陷入了Android外部存储管理的混乱。我曾读到,Android 4.4中的系
我到底应该怎么做?我希望支持尽可能多的设备和Android版本(至少4.4+),同时尽可能少的用户交互。我知道现在已经采用了存储技术,这听起来很适合我的工作,但需要用户在使用应用程序之前正确设置SD卡。鉴于此应用程序需要大量存储空间才能运行,我们决定假设我们只支持带有可移动SD卡的设备。在首次创建sqlite DB时,我们一直使用此概念来获取/创建路径字符串。我相信您不需要对安装的媒体进行测试,但也就是说,谁知道最终用户会做什么。下面的代码在发布活动中
public void onAvail() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {
File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
THE_PATH = String.valueOf(removable) + "/Documents/";
System.out.println("ALL TRUE ==> " + THE_PATH);
} else {// if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
THE_PATH = "";
System.out.println("ALL FALSE ==> "+ THE_PATH);
}
此代码位于DBHelper类中
公共静态最终字符串DB_NAME=路径+密码
由于我缺乏一些经验,并且没有看到任何人使用这个概念,返回的字符串在我看来很奇怪
/storage/0905-3E16/Android/data//files/Documents/在首次创建sqlite DB时,我们一直使用这个概念来获取/创建路径字符串。我相信您不需要对安装的媒体进行测试,但也就是说,谁知道最终用户会做什么。下面的代码在发布活动中
public void onAvail() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {
File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
THE_PATH = String.valueOf(removable) + "/Documents/";
System.out.println("ALL TRUE ==> " + THE_PATH);
} else {// if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
THE_PATH = "";
System.out.println("ALL FALSE ==> "+ THE_PATH);
}
此代码位于DBHelper类中
公共静态最终字符串DB_NAME=路径+密码
由于我缺乏一些经验,并且没有看到任何人使用这个概念,返回的字符串在我看来很奇怪
/storage/0905-3E16/Android/data//files/Documents/撇开您想在移动设备上写入4gigs数据这一事实不谈——Android确实支持在SD卡上创建dirs/文件。官方文档中有大量关于该主题的信息。所有方法名称中带有“External”的存储功能都用于外部存储或可移动媒体。但你说的是私人数据。要保持数据私有,请使用
getFilesDir()
。请解释您真正想要什么。getExternalFilesDirs()获取外部存储位置数组。那我怎么知道该用哪一个呢代码>你的应用程序可以使用所有。即使没有请求任何许可。第一个位置是外部存储器。第二个是sd卡。第三个usb otg。采用了存储,这听起来很适合我的工作,但要求用户在使用应用程序之前正确设置SD卡。不,用户不必为此做任何事情。仅在请求权限时允许。在安卓7.0之前,sd卡必须被选择用于存储访问框架。我真正想要的是私人存储,但数据太大了。我们希望支持的很多设备的内部存储空间都接近4GB,但它们确实有可移动SD卡。因此,我们尝试使用它,但我很难理解如何以一致和直接的方式访问可移动存储。我已经阅读了很多文档和其他文章,我得到了完全不同的信息。我是否应该使用SAF?撇开你想在移动设备上写入4gigs数据的事实不谈,Android确实支持在SD卡上创建目录/文件。官方文档中有大量关于该主题的信息。所有方法名称中带有“External”的存储功能都用于外部存储或可移动媒体。但你说的是私人数据。要保持数据私有,请使用getFilesDir()
。请解释一下