You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12 Kotlin:如何将raw文件夹的MP4文件复制到共享存储?

解决Android将raw文件夹MP4复制到共享存储的问题

你的代码仅创建了空的视频文件,没有正确完成数据写入,核心问题是单字节读写的方式不仅效率极低,还容易导致数据不完整。以下是修正后的实现方案:

修正后的完整代码

class MainActivity : AppCompatActivity() {

    @RequiresApi(Build.VERSION_CODES.Q)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        copyVideo()
    }

    private fun copyVideo() {
        val videoFileName = "video_name.mp4"
        val values = ContentValues().apply {
            put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName)
            put(MediaStore.Video.Media.MIME_TYPE, "video/mp4")
            // 指定存储到系统Movies目录,符合共享存储规范
            put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES)
            put(MediaStore.Video.Media.IS_PENDING, 1)
        }

        val collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
        val item = contentResolver.insert(collection, values) ?: return

        contentResolver.openFileDescriptor(item, "w")?.use { fd ->
            FileOutputStream(fd.fileDescriptor).use { outputStream ->
                resources.openRawResource(R.raw.video_name).use { inputStream ->
                    // 用Kotlin标准库的缓冲区拷贝方法,高效且保证数据完整
                    inputStream.copyTo(outputStream)
                }
            }
        }

        // 标记文件完成,触发媒体扫描器识别
        values.clear()
        values.put(MediaStore.Video.Media.IS_PENDING, 0)
        contentResolver.update(item, values, null, null)
    }
}

关键修改说明

  • 指定存储路径:添加RELATIVE_PATH参数,确保文件存到系统默认的Movies目录,符合Android Q及以上的共享存储规则
  • 高效流拷贝:用inputStream.copyTo(outputStream)替代单字节读写,内部默认使用8KB缓冲区,既高效又能保证数据完整写入
  • 自动资源管理:所有流都用use函数包裹,无需手动调用close(),避免资源泄漏
  • 空安全处理:用?: return处理contentResolver.insert可能返回null的情况,避免空指针异常
  • 完整文件名:给文件名加上.mp4后缀,确保播放器能正确识别视频格式

内容的提问来源于stack exchange,提问作者y_ok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:54:15