Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多个版本的Android上正确访问大型应用程序专用数据的外部存储_Android - Fatal编程技术网

如何在多个版本的Android上正确访问大型应用程序专用数据的外部存储

如何在多个版本的Android上正确访问大型应用程序专用数据的外部存储,android,Android,我已经断断续续地为这个问题挣扎了好几个月,谷歌似乎只是想通过每五分钟改变一次整个事情的运作方式,让每个人都尽可能地难受,而网上的信息是分散的、不连贯的、自相矛盾的。我希望这里有人能理解这一点来帮助我 我有一个应用程序,允许用户对存储在设备本身上的相当大(~4GB)的数据源执行脱机地址检查。此数据在技术上是应用程序私有的,其他应用程序不应访问此数据(尽管这不是主要问题)。由于数据量很大,我一直避免使用内部私有存储,这让我陷入了Android外部存储管理的混乱。我曾读到,Android 4.4中的系

我已经断断续续地为这个问题挣扎了好几个月,谷歌似乎只是想通过每五分钟改变一次整个事情的运作方式,让每个人都尽可能地难受,而网上的信息是分散的、不连贯的、自相矛盾的。我希望这里有人能理解这一点来帮助我

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

现在我发现Android 5、6和7的情况又发生了变化,我感到非常困惑。官方文档介绍了如何使用GetExternalFileDirs()获取外部存储位置数组。那我怎么知道该用哪一个呢?我的应用程序甚至可以访问这些位置吗?安卓似乎还没有为第三方应用程序需要大量私有存储做好准备

我还读到,从Android 5开始,我需要使用存储访问框架写入SD卡,让用户选择目录授予权限

这一切似乎荒谬地没有必要。我想做的就是让我的应用程序能够在没有太多用户输入的情况下(最终用户甚至不需要具备基本的技术知识)顺利地将4GB的私人数据读/写到设备上的某个地方,并让它在大多数设备上工作。不同的制造商拥有不同的存储选项,再加上安卓烦人地试图将美国开发者与文件系统分开,这使得这个简单的任务变成了一场噩梦


我到底应该怎么做?我希望支持尽可能多的设备和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()
。请解释一下