Android中如何获取registerForActivityResult录制视频的Uri?
获取CaptureVideo录制的视频Uri解决方案
核心原理
ActivityResultContracts.CaptureVideo()的设计逻辑是将录制的视频写入你传入的Uri,它的返回值仅告知写入是否成功,因此你需要提前创建一个合法的可写入Uri,并在launch时传入,录制成功后直接使用这个预创建的Uri即可。
具体实现步骤
- 创建用于保存视频的Content Uri
通过ContentResolver向MediaStore插入一条视频记录,获取可写入的Uri:
private fun createVideoUri(): Uri? { val videoContentValues = ContentValues().apply { // 设置视频文件名(用时间戳避免重复) put(MediaStore.Video.Media.DISPLAY_NAME, "app_record_${System.currentTimeMillis()}.mp4") // 指定视频MIME类型 put(MediaStore.Video.Media.MIME_TYPE, "video/mp4") // 设置保存路径(系统Movies目录下的自定义子目录) put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/MyAppVideos") } // 插入到外部存储的视频媒体库 return contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoContentValues) }
- 保存Uri并启动录制
提前保存创建好的Uri,在launch时传入,录制成功后直接使用该Uri:
private var savedVideoUri: Uri? = null private val recordVideoLauncher = registerForActivityResult(ActivityResultContracts.CaptureVideo()) { isSuccess -> if (isSuccess == true) { savedVideoUri?.let { uri -> // 这里直接使用uri操作视频(播放、上传、编辑等) Log.d(TAG, "视频录制成功,Uri: $uri") handleRecordedVideo(uri) } } else { Log.d(TAG, "视频录制失败或用户取消") } } // 触发录制的方法 fun startVideoRecording() { savedVideoUri = createVideoUri() savedVideoUri?.let { recordVideoLauncher.launch(it) } ?: run { Log.e(TAG, "无法创建视频保存Uri,请检查权限或存储状态") } }
关键注意事项
- 不能传入
Uri.EMPTY:这是一个无效的空Uri,相机应用无法写入视频,会导致录制失败。 - 权限适配:Android 10(API 29)及以上无需申请
WRITE_EXTERNAL_STORAGE权限,通过MediaStore插入的Uri自带写入权限;Android 9及以下需要提前申请该权限。 - Uri生命周期:如果需要长期保存Uri,建议将Uri的字符串形式存入SharedPreferences或数据库,避免页面重建后丢失。
内容的提问来源于stack exchange,提问作者Samarthya Bararia
相关产品推荐
相关产品推荐

