如何在多个Android版本上正确访问外部存储空间以获取大型应用私有数据

时间:2017-01-04 10:40:08

标签: android

我几个月来一直在努力解决这个问题,似乎谷歌正试图通过改变每五分钟整个事情的工作方式让每个人尽可能地困难,而且网上的信息分散,语无伦次,并且自相矛盾。我希望有人能够理解这一点,以帮助我。

我有一个应用程序,允许用户对存储在设备本身的相当大(~4GB)的数据源执行脱机地址检查。这些数据在技术上属于app-private,其他应用程序无法访问(尽管这不是主要问题)。由于数据量很大,我一直避免使用内部私有存储,这使我陷入了Android外部存储管理的混乱之中。我已经读过,在Android 4.4中,系统发生了变化,因此除了特定于软件包的目录外,应用程序无法写入SD卡。但是,Android似乎永远不会为我创建此目录,也不允许我的应用程序创建目录。我被迫将SD卡安装到我的笔记本电脑上并手动创建包目录!这不是我期望最终用户做的事情,所以我的第一个问题是如何/何时在SD卡上创建特定于包的目录?

现在我发现安卓5,6再次发生了变化,显然也是7,我感到非常困惑。官方文档讨论了如何使用getExternalFilesDirs()获取外部存储位置数组。我怎么知道使用哪一个?我的应用甚至可以访问这些位置吗?似乎Android还没有为第三方应用做好准备,需要大量私有存储。

我还读到,从Android 5开始,我需要使用Storage Access Framework写入SD卡,让用户选择要授予权限的目录。

这一切似乎都是荒谬的。我想做的就是让我的应用程序顺利进行 - 并且没有太多的用户输入(最终用户甚至不需要基本的技术知识) - 在设备的某个地方读/写大约4GB的私有数据并让它工作在大多数设备上。不同制造商拥有不同存储选项的方式,以及Android烦人的尝试将我们的开发人员与文件系统分开的方式,使这个简单的任务成为一场噩梦!

我到底应该怎么做?我希望尽可能少的用户交互支持尽可能多的设备和Android版本(至少4.4+)。据我所知,现在采用的存储空间对于我正在做的事情听起来很棒,但要求用户在使用应用程序之前正确设置SD卡。鉴于此应用程序需要大量存储空间才能运行,我们决定假设我们只支持带有可移动SD卡的设备。

1 个答案:

答案 0 :(得分:0)

我们一直在使用这个概念来在首次创建sqlite DB时获取/创建路径字符串。我确信您不需要测试MEDIA_MOUNTED,但是说谁知道最终用户会做什么。以下代码位于发布活动中。

    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类中 public static final String DB_NAME = THE_PATH +“PassWord”;

由于我缺乏一些经验并且没有看到任何人使用这个概念,返回的字符串对我来说很奇怪     /存储/ 0905-3E16 / Android设备/数据文件// /文档/