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

标签 android file storage storage-access-framework documentfile

介绍

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

总览

通常,您具有以下存储:


主存储器(总是直接访问,主要在内部存储器上,但这取决于电话制造商)
辅助存储(可直接从android <= 4.3访问)
其他外部存储设备,例如USB OTG ...


提出以下问题:


如何找出所有可用的本地存储+找出类型(主要,次要内部存储器,SD卡,USB)?
列出存储中的所有可用文件

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

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

2.3如何获取不带MediaStore的所有文件?
如何编辑这些存储上的文件?


我已经知道的大多数事情,大部分是基于媒体存储为哪些数据编制索引,如何找出可用的存储,如何标识存储等问题,因此我发布了一个答案,该答案回答了大多数部分,并且还显示每个问题<=>安卓版本对的状态,以便可以轻松看到仍缺少哪些信息

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

Android <4.4


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


Android 4.4


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


安卓> = 5


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

最佳答案

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

Android <4.4:

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

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

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

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

2.1哪些存储将通过MediaStore进行索引? (un)

我已经看到有时对外部存储建立索引,有时却不对索引建立索引,我不确定默认行为是什么...

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

只需通过以下内容在ContentProvider上通过查询列出所有文件:URI,具体取决于所需的数据

2.3如何获取不带MediaStore.<Audio,Video,Images,File>.Media.EXTERNAL_CONTENT_URI的所有文件? (已知✔)

在此android版本上,您只需要MediaStore,然后可以通过android.permission.WRITE_EXTERNAL_STORAGE类直接列出外部存储上的所有文件。您需要知道的是从点1开始可用的根路径。

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

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

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

Android 4.4:

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

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

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

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

2.1哪些存储将通过Storage Access Framework进行索引? (un)

在此设备上,仅主存储将被索引,对吗?

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

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

2.3如何获取不带MediaStore的所有文件? (part)

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

3.如何编辑那些存储上的文件? (part)

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

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

Android> = 5:

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

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

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

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


然后,只需记住返回的File并从Uri获取结果时坚持Uri即可:

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)。

根路径下的所有文件都可以通过Storage Access Framework类读取和写入。

2.1哪些存储将通过DocumentFile进行索引? (known)

我认为只有小学。正确?

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

像以前一样...

2.3如何获取不带MediaStore的所有文件? (已知✔)

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

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

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

关于android - 如何管理所有版本的所有本地存储(主存储,辅助存储,SD卡,USB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231022/

相关文章:

c++ - 在 C++ 中创建动态文件指针

c++ - 在文件中找到字符串后替换它旁边的字符

MYSQL 存储意外增加(RDS)

android - 开始 Android 开发 : Native or cross-platform?

安卓。 fragment getActivity() 有时返回 null

ruby - Rails/重命名或 move 文件

python - python中的安全凭证存储

iPhone - 应用内购买 : recording the purchase

android - 为什么 View 动画有时会被剪裁?

android - 如何知道一个应用程序是第一次下载还是多次从市场下载?