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
相关产品推荐
相关产品推荐

