在Uri旁边创建新文件

时间:2017-05-25 22:14:05

标签: java android file android-file

我刚刚开始帮助建立一个已经建立的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。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:4)

  

我从Uri获得的路径名称如下所示:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4

Uri不是文件。如果Uri的方案恰好是file那么 Uri的路径将是文件系统路径。否则,它是一个不透明的字符串。

  

我不知道如何制作和打开像这样的那个

旁边的新文件

rootUri是指向文档树的Uri。所以,鉴于:

步骤1:将其包裹在DocumentFilevia fromTreeUri()

步骤2:在同一棵树using createFile()

中创建另一个文档

第3步:使用Uri createFile()以与使用documentUri

相同的方式获得DocumentsProvider

现在,请记住,您没有严格控制文件名。 可能 createFile()处理USB OTG将使用"显示名称"你传递给DocumentsContract作为文件名。这不是必要条件。存储访问框架({{1}}等)背后的重点是远离文件和文件名的思考。