首页 > 解决方案 > 从录制的视频中获取路径

问题描述

目前我正在开发一个简单的应用程序来使用 kotlin 录制视频,但是当我想从之前录制的视频中获取绝对路径时我遇到了困难。这是我用 kotlin 编写的代码

    private fun dispatchTakeVideoIntent() {
        val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
        startActivityForResult(intent, 1)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK) {
            val videoUri: Uri? = data?.data
            val file = File(videoUri?.path)
        }
    }

我已经videoUri使用转换为路径,videoUri?.path但它总是以类似的方式返回给我/external/video/media/55,而我的视频文件路径类似于/storage/emulated/0/DCIM/Camera/video.mp4

我可以获取文件路径而不是录制视频的 uri 吗?任何帮助或提示将不胜感激。

PS:这可能之前在另一个问题中被问过:如何在 android 中获取录制的视频路径?但它没有任何可接受的答案,所以我认为可以再次询问。

标签: androidkotlinurifilepath

解决方案


我可以获取文件路径而不是录制视频的 uri 吗?

不需要将视频记录为文件系统上的文件,更不用说在您可以通过文件系统 API 访问的位置。

如果返回的方案Uri恰好是file,那么getPath()将返回文件的文件系统路径。但是,不能保证您可以使用该文件,并且该file方案自 Android 7.0 以来已在很大程度上被禁止。

该计划更有可能成为content. 这Uri可能指向:

  • 您的应用可以读取的外部存储上的本地文件
  • 外部存储上的本地文件,但在您的应用将无法读取的位置
  • 另一个应用程序的内部存储上的本地文件
  • 可移动存储上的本地文件
  • 已加密且需要即时解密的本地文件
  • 保存在数据库的 BLOB 列中的字节流
  • 需要先被其他app下载的一段内容
  • ...等等

而且,就像使用httpsURL 一样,没有神奇的方法可以将路径部分转换Uri为某个文件系统路径。

我需要文件系统路径,因为我想稍后使用 FFmpeg 处理它

我将首先查看是否有人拥有可以与Uri.

如果这不可用,那么您将需要在您控制的文件中制作内容的副本:

  • 使用ContentResolverandopenInputStream()获取InputStream内容,传入你的Uri
  • 打开FileOutputStream某个文件(例如,在 中getCacheDir()
  • 将字节从 复制InputStreamFileOutputStream(Kotlin 有一些很棒的扩展函数)

或者,与其使用ACTION_VIDEO_CAPTURE,不如使用相机库并直接在您的应用程序中拍摄视频,而不是尝试依赖第三方应用程序来拍摄视频。


推荐阅读