在 Uri 旁边创建新文件
Make new file next to Uri
我刚开始帮助一个已建立的 android 项目,但不知道如何让系统按照我的意愿行事。请记住,我对 android 还是很陌生,所以如果这个问题的一部分没有意义,或者我说错了,我深表歉意。
该项目使用ContentResolver
遍历USB OTG记忆棒或内部存储的DCIM文件夹。我得到的是找到的每个视频文件的 Uri。我需要打开并获取该文件的原始文件描述符编号,然后在它旁边创建一个新文件进行写入(名称如 originalvideo.mp4.trim.mp4,不一定要漂亮),并且也获取原始文件描述符编号。
项目对这些文件进行 ffmpeg 调用,为了避免 OTG 棒的权限错误(因为 Google 更新的 OTG 权限非常严格),我们只能使用从 [=35 获得的文件描述符=].这是一个让人头疼的问题,但经过数周的摸索,这是我们找到的唯一可行的方法,因此我们坚持使用它。
这是遍历循环中当前发生的情况:
final Uri documentUri = DocumentsContract.buildDocumentUriUsingTree(rootUri, docId);
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(documentUri, "r");
if (fd != null) {
int ret = NativeLib.testFd( fd.getFd( ) );
}
我从 Uri 获得的路径名如下所示:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4
我不知道如何在该文件旁边创建和打开一个新文件:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4.trim.mp4
.我试过将 Uri 转换为文件,我试过在创建文件之前编辑路径,但都抛出 IOExceptions,说 No such file or directory
。不,呃,我正在尝试创建它。
这是我最接近让它工作的时间:
File f = new File( documentUri.getPath() + ".trim.mp4" );
if( !f.exists() )
f.createNewFile();
ParcelFileDescriptor fn = ParcelFileDescriptor.open( f, ParcelFileDescriptor.MODE_WRITE_ONLY );
但即使这样也会引发 IOExcept。
感谢您提供的任何帮助。
The path names I get from the Uri look like this: /tree/primary:DCIM/document/primary:DCIM/V0480060.MP4
A Uri
不是文件。如果 Uri
的方案恰好是 file
, 那么 Uri
的路径将是一个文件系统路径。否则,它是一个不透明的字符串。
I am at a loss as to how to make and open a new file next to that one like this
rootUri
是指向文档树的 Uri
。因此,鉴于:
第 1 步:将其包装在 DocumentFile
、via fromTreeUri()
中
步骤 #2:在同一树中创建另一个文档,using createFile()
第 3 步:以与使用 documentUri
相同的方式使用从 createFile()
获得的 Uri
现在请记住,您对文件名没有严格的控制。 可能 DocumentsProvider
处理 USB OTG 将使用您传递给 createFile()
的 "display name" 作为文件名。这不是必需的。存储访问框架(DocumentsContract
等)背后的要点是摆脱对文件和文件名的思考。
我刚开始帮助一个已建立的 android 项目,但不知道如何让系统按照我的意愿行事。请记住,我对 android 还是很陌生,所以如果这个问题的一部分没有意义,或者我说错了,我深表歉意。
该项目使用ContentResolver
遍历USB OTG记忆棒或内部存储的DCIM文件夹。我得到的是找到的每个视频文件的 Uri。我需要打开并获取该文件的原始文件描述符编号,然后在它旁边创建一个新文件进行写入(名称如 originalvideo.mp4.trim.mp4,不一定要漂亮),并且也获取原始文件描述符编号。
项目对这些文件进行 ffmpeg 调用,为了避免 OTG 棒的权限错误(因为 Google 更新的 OTG 权限非常严格),我们只能使用从 [=35 获得的文件描述符=].这是一个让人头疼的问题,但经过数周的摸索,这是我们找到的唯一可行的方法,因此我们坚持使用它。
这是遍历循环中当前发生的情况:
final Uri documentUri = DocumentsContract.buildDocumentUriUsingTree(rootUri, docId);
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(documentUri, "r");
if (fd != null) {
int ret = NativeLib.testFd( fd.getFd( ) );
}
我从 Uri 获得的路径名如下所示:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4
我不知道如何在该文件旁边创建和打开一个新文件:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4.trim.mp4
.我试过将 Uri 转换为文件,我试过在创建文件之前编辑路径,但都抛出 IOExceptions,说 No such file or directory
。不,呃,我正在尝试创建它。
这是我最接近让它工作的时间:
File f = new File( documentUri.getPath() + ".trim.mp4" );
if( !f.exists() )
f.createNewFile();
ParcelFileDescriptor fn = ParcelFileDescriptor.open( f, ParcelFileDescriptor.MODE_WRITE_ONLY );
但即使这样也会引发 IOExcept。
感谢您提供的任何帮助。
The path names I get from the Uri look like this: /tree/primary:DCIM/document/primary:DCIM/V0480060.MP4
A Uri
不是文件。如果 Uri
的方案恰好是 file
, 那么 Uri
的路径将是一个文件系统路径。否则,它是一个不透明的字符串。
I am at a loss as to how to make and open a new file next to that one like this
rootUri
是指向文档树的 Uri
。因此,鉴于:
第 1 步:将其包装在 DocumentFile
、via fromTreeUri()
步骤 #2:在同一树中创建另一个文档,using createFile()
第 3 步:以与使用 documentUri
createFile()
获得的 Uri
现在请记住,您对文件名没有严格的控制。 可能 DocumentsProvider
处理 USB OTG 将使用您传递给 createFile()
的 "display name" 作为文件名。这不是必需的。存储访问框架(DocumentsContract
等)背后的要点是摆脱对文件和文件名的思考。