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

Android中如何获取registerForActivityResult录制视频的Uri?

获取CaptureVideo录制的视频Uri解决方案

核心原理

ActivityResultContracts.CaptureVideo()的设计逻辑是将录制的视频写入你传入的Uri,它的返回值仅告知写入是否成功,因此你需要提前创建一个合法的可写入Uri,并在launch时传入,录制成功后直接使用这个预创建的Uri即可。

具体实现步骤

  1. 创建用于保存视频的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)
}
  1. 保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:45:33