我刚刚开始帮助建立一个已经建立的android项目,并且不知道如何将系统变成我想要的东西。请记住,我对Android仍然很新,所以如果这个问题的一部分没有意义,或者我说错了,请道歉。
项目使用ContentResolver
遍历usb OTG棒或内部存储的DCIM文件夹。我给出的是每个视频文件的Uri。我需要打开并获取该文件的原始文件描述符号,然后在其旁边创建一个新文件进行写入(名称如originalvideo.mp4.trim.mp4,不一定非常漂亮),并得到一个原始文件描述符编号。
该项目对这些文件进行ffmpeg调用,并且为了避免使用OTG棒的权限错误(因为Google更新了OTG权限非常严格),我们只能使用从Java获取的文件描述符。这是颈部的皇家痛苦,但经过几周的探索,这是我们发现这项工作的唯一方法,所以我们坚持下去。
这是遍历循环中当前发生的事情:
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。
感谢您提供任何帮助。
答案 0 :(得分:4)
我从Uri获得的路径名称如下所示:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4
Uri
不是文件。如果Uri
的方案恰好是file
,那么 Uri
的路径将是文件系统路径。否则,它是一个不透明的字符串。
我不知道如何制作和打开像这样的那个
旁边的新文件
rootUri
是指向文档树的Uri
。所以,鉴于:
步骤1:将其包裹在DocumentFile
,via fromTreeUri()
步骤2:在同一棵树using createFile()
第3步:使用Uri
createFile()
以与使用documentUri
DocumentsProvider
现在,请记住,您没有严格控制文件名。 可能 createFile()
处理USB OTG将使用"显示名称"你传递给DocumentsContract
作为文件名。这不是必要条件。存储访问框架({{1}}等)背后的重点是远离文件和文件名的思考。