如何管理所有版本中的所有本地存储(主存储,辅助存储,SD卡,USB)

时间:2016-02-05 18:27:27

标签: android file storage storage-access-framework documentfile

简介

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

概述

通常您有以下存储空间:

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

提出以下问题:

  1. 如何查找所有可用的本地存储空间+找出类型(主要,次要,内部,SD卡,USB)?

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

    2.1哪些存储将通过MediaStore索引?

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

    2.3如何获取没有MediaStore的所有文件?

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

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

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

    Android< 4.4

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

    Android 4.4

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

    Android> = 5

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

1 个答案:

答案 0 :(得分:1)

<强> -------------------------------------------- -

Android&lt; 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课程完成。

<强> -------------------------------------------- -

Android 4.4:

<强> -------------------------------------------- -

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

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

基本上,这应该与android&lt; 4.4 ...

2.1哪些存储将通过MediaStore编入索引? (未知✖)

在此设备上,只会将主存储设备编入索引,对吗?

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

与在android上工作的方式相同&lt; 4.4 ...

2.3如何获取没有MediaStore的所有文件? (部分已知✖)

在主存储器上,它的工作方式与在android&lt; 4.4上的工作方式相同。我不知道它在其他本地存储的Android版本上是如何工作的......

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

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

<强> -------------------------------------------- -

Android&gt; = 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,并在从Uri获取结果时保留Storage 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的帮助下)。