【问题标题】:Make new file next to Uri在 Uri 旁边创建新文件
【发布时间】:2017-10-26 16:49:09
【问题描述】:

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: java android file android-file


    【解决方案1】:

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

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

    我不知道如何在这样的文件旁边制作和打开一个新文件

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

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

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

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

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

    【讨论】:

    • 非常感谢您的帮助。我能够使用Uri newkid = DocumentsContract.createDocument(contentResolver, childrenUri, "video/mp4", oldname + "trim.mp4" ); 在旧的旁边创建一个新的孩子。
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2021-06-01
    • 2016-02-12
    • 2017-01-27
    • 2018-01-13
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多