在 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 步:将其包装在 DocumentFilevia fromTreeUri()

步骤 #2:在同一树中创建另一个文档,using createFile()

第 3 步:以与使用 documentUri

相同的方式使用从 createFile() 获得的 Uri

现在请记住,您对文件名没有严格的控制。 可能 DocumentsProvider 处理 USB OTG 将使用您传递给 createFile() 的 "display name" 作为文件名。这不是必需的。存储访问框架(DocumentsContract 等)背后的要点是摆脱对文件和文件名的思考。