2

介绍

管理主存储文件+辅助存储文件(仅限本地):我将列出我已经拥有的所有信息,并希望您扩展它们或纠正我,以便这个问题希望成为一个概述,总结某人必须知道的所有主要信息在开始使用本地存储之前。我相信很多人都在寻找这样的概述......

概述

通常你有以下存储:

  • 主存储(始终可直接访问,主要在内部存储上,但取决于手机制造商)
  • 辅助存储(android <=4.3 可直接访问)
  • 其他外部存储,例如 USB OTG...

提出以下问题:

  1. 如何找出所有可用的本地存储 + 找出类型(主要、次要、内部、sd 卡、usb)?

  2. 列出存储中的所有可用文件

    2.1 哪​​些存储将通过MediaStore?

    2.2 如何通过 ? 获取所有文件MediaStore

    2.3 如何在没有 的情况下获取所有文件MediaStore

  3. 如何编辑这些存储上的文件?

我已经知道的大部分事情,主要是我的问题是基于媒体存储索引的数据,如何找出可用的存储,如何识别存储......所以我发布了一个回答大部分问题的答案部分,并且还显示每个问题的状态 <=> android 版本对,以便很容易看到仍然缺少哪些信息

状态 - 如果您知道更多或我错了,请随时扩展/更正我对问题的回答

安卓 < 4.4

  • 问题 1 - 部分已知 ✖</li>
  • 问题 2.1 - 未知 ✖</li>
  • 问题 2.2 - 已知 ✔</li>
  • 问题 2.3 - 已知 ✔</li>
  • 问题 3 - 已知 ✔</li>

安卓 4.4

  • 问题 1 - 部分已知 ✖</li>
  • 问题 2.1 - 未知 ✖</li>
  • 问题 2.2 - 已知 ✔</li>
  • 问题 2.3 - 部分已知 ✖</li>
  • 问题 3 - 部分已知 ✖</li>

安卓 >=5

  • 问题 1 - 部分已知 ✖</li>
  • 问题 2.1 - 未知 ✖</li>
  • 问题 2.2 - 已知 ✔</li>
  • 问题 2.3 - 已知 ✔</li>
  • 问题 3 - 已知 ✔</li>
4

1 回答 1

1

----------------------------------------------

安卓 <4.4:

----------------------------------------------

1.如何找出所有可用的本地存储+找出类型(主要,次要,内部,sd卡,usb)?(部分已知✖)

我不确定如何正确区分可用存储...可以通过File primaryStorage = context.getExternalCacheDir(). 或者您可以通过File[] dirs = ContextCompat.getExternalFilesDirs(context, null);. 这将列出所有可用的路径,不确定它是否也会返回 USB 存储,或者它是否可靠地添加了 sd 卡路径......

我实际上不知道如何可靠地找出哪个路径是内部的,哪个是 SD 卡,哪个是 USB 驱动器

2.1 哪​​些存储将通过MediaStore? (未知✖)

我看到有时外部存储被索引,有时没有,我不确定默认行为是什么......

2.2 如何通过 ? 获取所有文件MediaStore(已知✔)

ContentProvider只需通过以下查询列出所有文件URI: MediaStore.<Audio,Video,Images,File>.Media.EXTERNAL_CONTENT_URI,具体取决于您想要的数据

2.3 如何在没有 的情况下获取所有文件MediaStore(已知✔)

在这个 android 版本上你只需要android.permission.WRITE_EXTERNAL_STORAGE, 然后你可以通过类直接列出外部存储上的所有文件File。您只需要知道第 1 点的可用根路径

3. 如何编辑这些存储上的文件?(已知✔)

File如果您在清单中具有上述权限,则可以直接通过课程完成。

----------------------------------------------

安卓 4.4:

----------------------------------------------

该设备非常具体,因为它尚未提供Storage Access Framework但已经限制了对辅助存储的访问!

1.如何找出所有可用的本地存储+找出类型(主要,次要,内部,sd卡,usb)?(部分已知✖)

基本上,这应该以与 android < 4.4 相同的方式实现......

2.1 哪​​些存储将通过MediaStore? (未知✖)

在这个设备上,只有主存储会被索引,对吗?

2.2 如何通过 ? 获取所有文件MediaStore(已知✔)

工作方式与在 android < 4.4 上的工作方式相同...

2.3 如何在没有 的情况下获取所有文件MediaStore(部分已知✖)

在主存储上,它的工作方式与在 android <4.4 上的工作方式相同。我不知道它如何在这个 android 版本上用于其他本地存储......

3. 如何编辑这些存储上的文件?(部分已知✖)

主存储文件将可通过File该类进行编辑。我不知道如何获得对其他存储的可靠写访问...

----------------------------------------------

安卓 >=5:

----------------------------------------------

1.如何找出所有可用的本地存储+找出类型(主要,次要,内部,sd卡,usb)?(部分已知✖)

像以前一样获得主存储是可能的。我不知道如何获取所有其他存储的列表。手动方式是让用户选择二级存储的根目录、sd卡、usb棒,如下图:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
context.startActivityForResult(intent, 1234);

之后只需记住返回的并在从以下获取结果时Uri坚持:UriStorage Access Framework

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == 1234)
    {
        if (resultCode == Activity.RESULT_OK)
        {
            // get uri
            Uri treeUri = data.getData();

            // persist permissions
            final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            // remember the uri for having access to the storage
            // ...
        }
        return true;
    }
    return false;
}

我不知道如何找出用户选择的目录类型(sd 卡、usb)。

DocumentFile根路径下的所有文件都可以通过该类进行读写。

2.1 哪​​些存储将通过MediaStore? (未知✖)

我认为只有初级。正确的?

2.2 如何通过 ? 获取所有文件MediaStore(已知✔)

像以前一样工作...

2.3 如何在没有 的情况下获取所有文件MediaStore(已知✔)

对于主存储,它也像以前一样工作(只是通过File类),其余的你必须使用Uri你在第 1 点中获得的相应存储。然后你可以使用DocumentFile类来获取所有文件

3. 如何编辑这些存储上的文件?(已知✔)

主存储文件可以通过File类进行编辑,其余的可以通过DocumentFile(在第 1 点的树的帮助下Uri)进行编辑。

于 2016-02-05T18:37:55.823 回答