简介
管理主存储文件+辅助存储文件(仅限本地): 我将列出我已经拥有的所有信息,并希望您扩展它们或纠正我,以便这个问题有希望成为概述,总结了在开始使用LOCAL存储之前必须知道的所有主要信息。我相信很多人都在寻找这样的概述......
概述
通常您有以下存储空间:
提出以下问题:
如何查找所有可用的本地存储空间+找出类型(主要,次要,内部,SD卡,USB)?
列出存储空间中的所有可用文件
2.1哪些存储将通过MediaStore
索引?
2.2如何通过MediaStore
获取所有文件?
2.3如何获取没有MediaStore
的所有文件?
如何编辑这些存储空间上的文件?
我已经知道的大部分内容,主要是我的问题是基于媒体商店索引的数据,如何找出可用的存储空间,如何识别存储空间......所以我发布了答案答案大多数部分并且还显示每个问题的状态< => Android版本对,以便很容易看到哪些信息仍然缺失
状态 - 如果您了解更多或我错了,请随时扩展/更正我对问题的回答
Android< 4.4
Android 4.4
Android> = 5
答案 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
的帮助下)。