当前位置: 首页 > 知识库问答 >
问题:

将视频保存到Android的MediaStore时设置文件名和扩展名

杨景山
2023-03-14

我需要一些非常简单的东西-我的应用程序录制了一个mp4文件,我想将其插入MediaStore到用户的视频收藏中。这是我的代码,包括处理新范围存储的推荐方法:

// fileToExpose is in internal storage with a name like video_1.mp4
fun copyVideoFileToMediaStore(fileToExpose: File, context: Context): Boolean {
    val resolver = context.contentResolver

    val volume = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) MediaStore.VOLUME_EXTERNAL_PRIMARY else MediaStore.VOLUME_EXTERNAL
    val videoCollection = MediaStore.Video.Media.getContentUri(volume)

    val videoDetails = ContentValues().apply {
        put(MediaStore.Video.Media.DISPLAY_NAME, fileToExpose.name)
        put(MediaStore.Video.Media.MIME_TYPE, "video/mp4")
        put(MediaStore.Video.Media.TITLE, name)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            put(MediaStore.Video.Media.IS_PENDING, 1)
        }
    }

    val videoContentUri = resolver.insert(videoCollection, videoDetails) ?: return false

    resolver.openFileDescriptor(videoContentUri, "w", null).use { pfd ->
        pfd ?: return false
        fileToExpose.inputStream().use { input ->
            FileOutputStream(pfd.fileDescriptor).use { output ->
                input.copyTo(output)
            }
        }
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        videoDetails.clear()
        videoDetails.put(MediaStore.Video.Media.IS_PENDING, 0)
        resolver.update(videoContentUri, videoDetails, null, null)
    }

    return true
}

但是,在这个函数调用名称为的文件后video_1.mp4变成了类似1589077991588.3gp的东西,所以名称和扩展名都不同(我的设备是Android 9)。MediaStore。MediaClons。DATA已弃用。我该如何解决这个问题?

共有1个答案

司空坚
2023-03-14

派对迟到了,但只是偶然发现了这个问题,并在这里寻找答案。在尝试的过程中,我想我找到了一个解决方案:更新MediaStore。视频。媒体。插入视频数据后的DISPLAY_NAME已经完成了任务(即在Android 8上)。

因此,虽然上述代码适用于Android 10及以上版本,但对于Android 9及以下版本,我在将内容写入流后添加了更新标题。

// [...] example as above, here we are after the `resolver.openFileDescriptor` section
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    videoDetails.clear()
    videoDetails.put(MediaStore.Video.Media.IS_PENDING, 0)
    resolver.update(videoContentUri, videoDetails, null, null)
} else {
    // On Android <= 9 we need to update the display name after writing the data to ensure the DISPLAY_NAME is correctly set
    videoDetails.clear()
    videoDetails.put(MediaStore.Video.Media.DISPLAY_NAME, fileToExpose.name)
    resolver.update(videoContentUri, videoDetails, null, null)
}

所以在Android上

 类似资料:
  • 我正在尝试使用来保存图像,但它总是以这个名称保存文件1637955326427.jpg并且文件的大小0 B。 <代码>列表。获取(0)。getDocFile()返回一个文档文件,我也在API 28上测试了这个,谢谢 请注意,此图像已存在于外部存储器中,只需复制即可。 编辑:我删除此代码是重复的。我真的很抱歉。文件工作正常,但盗用了错误的名称。

  • 我已经创建了一个chrome扩展来学习英语,它可以构建一个包含源代码/翻译等的词典。 现在,我想将这个“文件”(我将/会用字典条目构建一个“文件”)发送到Google Drive,并在我的Android应用程序中使用这个文件。 但我不想将此文件保存在我的个人驱动器帐户中,而是保存在当前用户的驱动器中,即使用chrome扩展名的用户(当然,如果该用户有驱动器帐户)。 在我找到的所有例子中,他们为“我

  • 我能够创建并开始拍摄视频。但是如何设置文件名并将其保存到特定目录? 这是我到目前为止所拥有的:

  • 我正在使用MediaStore和ContentResolver API使用MediaStore.Images保存图像文件(jpg/png/gif)。它可以工作,但问题是所有文件都以.jpg扩展名保存,并且文件名始终是“以毫秒为单位的当前时间.jpg”。 这是我在ContentValue中添加的示例: 但是在将其插入ContentResolver并写入文件后,显示名称更改为2067623.jpg,文

  • 问题内容: 我正在使用 Swing 框架和 JasperReports 开发基于 Java 桌面的应用程序进行报告。我遇到了一些问题,当 JasperViewer 出现时,我想保存报告。 __ 如何在保存对话框中设置文件名(默认为空白),以及如何仅限制 Pdf 格式? 这是我的代码: 问题答案: 为了设置要保存到的默认扩展名,一个想法是您需要以某种方式从(实例)获取实例,然后在void 实例上设置

  • 本文向大家介绍python3将视频流保存为本地视频文件,包括了python3将视频流保存为本地视频文件的使用技巧和注意事项,需要的朋友参考一下 使用python3+opencv3.3.1环境将视频流保存为本地视频文件,具体内容如下 1、利用opencv中的VideoCapture类获取视频流的链接,通过cv2的方法得到该视频流的帧数和每帧大小。 2、使用VideoWriter类进行视频编码 3、通