----------------------------------------------
安卓 <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
坚持: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
)进行编辑。