【发布时间】:2021-03-26 23:15:13
【问题描述】:
我对@987654322@ 和Storage Access Framework (SAF) 以及所有限制感到非常困惑。我需要使用File API,而不是Uri,所以:
Android API 级别 /storage/emulated/0 有效(使用 requestLegacyExternalStorage)。
Android API 级别 = 30 (Android 11) 保存到 /storage/emulated/0 不起作用 (IOException: Operation not permitted)。
Environment.getExternalStorageDirectory() 已弃用。好的,所以getExternalFilesDirs() 在 Android 11 中:
ctx.getExternalFilesDirs(): /storage/emulated/0/Android/data/<package name>/files //External storage in internal memory
ctx.getExternalFilesDirs(): /storage/16F4-3A1C/Android/data/<package name>/files //SDcard
有效,因为它是应用程序的存储空间。但是用户希望在外部存储/storage/emulated/0/MySpecificFolder 或sdcard /storage/16F4-3A1C/MySpecificFolder 的根目录中拥有应用程序的文件夹。我正在使用File API,它应该可以再次使用(与 Android10 不同)。
如何写入用户特定目录,例如/storage/emulated/0/MySpecificFolder?
我尝试使用:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, PICK_FOLDER);
打开文件管理器。用户创建新目录(因为 root 不能使用):/storage/emulated/0/MySpecificFolder。接下来我尝试通过以下方式创建一个新文件:
File nomedia = new File("/storage/emulated/0/MySpecificFolder", ".nomedia");
if (!nomedia.exists()) {
nomedia.createNewFile();
}
但它不起作用IOException: Operation not permitted。可能是写权限有问题。
这条线有效:
DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
适用于Uri。 为什么不能使用File API? 当我调用使用Uri 的createFile() 时,它可以工作,但是当我调用使用File API 的createNewFile() 时,它不起作用。所以用户可以选择自己的目录,但只有当应用程序使用Uri?
如何从 SAF 获取 path(供以后与 File API 一起使用),而不仅仅是 Uri。
// Get Uri from Storage Access Framework.
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
Log.i(TAG, "Tree uri: "+treeUri.getPath()); //returns /tree/primary:My
Log.i(TAG, "Picked dir: "+pickedDir.getUri().getPath()); //returns /tree/primary:My/document/primary:My
我需要使用 File API,因为 app.创建需要在一起的视频+照片+数据文件。
问题:用户是否可以选择自己的路径+创建文件夹(可能通过SAF)并将用户新创建的文件夹的File(文件描述符)返回给应用程序?
【问题讨论】:
-
"我需要使用 File API,因为 app. 创建需要放在一起的视频+照片+数据文件" -- 在
getFilesDir()中创建这些文件,然后将它们复制到用户选择的文档树.或者,选择让您使用流而不是文件的 SDK。 “用户是否可以选择自己的路径 + 创建文件夹(可能通过 SAF)并将用户新创建的文件夹的文件(文件描述符)返回给应用程序?” -- 不是File。您可以通过ContentResolver获取Uri的文件描述符。 -
也许这就是你需要的:github.com/anggrayudi/SimpleStorage
标签: android save file-permissions storage-access-framework android-11