我有一个复杂的图像处理应用程序,它使用 C++ 端的本机代码记录图像/视频,并希望写入 DCIM 文件夹。
我已经使用 Android 10 和 11 上的范围存储完成了这项工作,代码如下:
1.在媒体存储中插入条目
Uri placeholderUri = null;
ContentResolver contentResolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Video.Media.DISPLAY_NAME, "TEST_VIDEO");
contentValues.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
contentValues.put(MediaStore.Video.Media.RELATIVE_PATH, "DCIM/" + "APP_NAME");
try {
placeholderUri = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues);
} catch (RuntimeException e) {
e.printStackTrace();
}
2.从内容创建 ParcelFileDescriptor
ParcelFileDescriptor fd = null;
try {
fd = context.getContentResolver().openFileDescriptor(placeholderUri, "rw");
Log.d(TAG, "new fd: " + fd.getFd());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
3.通过将 fd 连接到“/proc/self/fd/”来获取应用程序应有权访问的开放资源的完整路径
return "/proc/self/fd/" + fd.getFd();
这种方法现在不适用于 Android 13 设备,因为我似乎没有对“/proc/self/fd”的写访问权限,我找不到任何关于为什么这不适用于 Android 13 的信息,但它适用于 Android 10 或 11。
有什么方法可以在不使用 StorageAccessFramework 的情况下与 MediaStore 一起使用吗?对于我的客户来说,依靠用户选择正确文件夹的想法将是最后一个选择,所以我想尽可能依赖 MediaStore。
谢谢!
DCIM 似乎是我们拥有授予文件归属于应用程序的读/写访问权限的少数几个地方之一。我在问题中提供的初始代码是一种创建归属于应用程序的文件的方法,以便我们可以进行写访问从本机方面。
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/" + albumName + "/" + fileName + ".mp4"
上面的代码可以获取应用程序可以读写访问的绝对路径。