2017-05-25 95 views
1

我刚开始帮助一个已建立的android项目,并且对如何将系统转换为做我想做的事情感到不知所措。请记住,我对android还是很新的,所以如果这个问题的一部分没有意义,我会道歉,或者我说错了。在Uri旁边创建新文件

该项目使用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()); 
} 

的路径名我从乌里得到这个样子:/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。

谢谢你提供的任何帮助。

回答

3

的路径名我从乌里这个样子:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4

一个Uri不是一个文件。如果Uri的方案碰巧是file,然后Uri的路径将是文件系统路径。否则,它是一个不透明的字符串。

我在一个不知如何做,并打开一个新的文件旁边一个像这样的

rootUri是指向文档树一个Uri。因此,考虑到:

第1步:总结在一个DocumentFilevia fromTreeUri()

第2步:建立在同一棵树上的另一个文档,using createFile()

第3步:使用Uri你从createFile()以与您使用的相同的方式获得documentUri

现在,请记住,您没有严格控制文件名。很可能处理USB OTG将使用您传入createFile()作为文件名的“显示名称”。这不是要求。存储访问框架(DocumentsContract等)背后的要点是摆脱文件和文件名的思考。

+0

非常感谢您的帮助。我能够使用'Uri newkid = DocumentsContract.createDocument(contentResolver,childrenUri,“video/mp4”,oldname +“trim.mp4”);'在老版本的旁边创建一个新的孩子。 – DweebsUnited