android - 从录制的视频中获取路径
问题描述
目前我正在开发一个简单的应用程序来使用 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 中获取录制的视频路径?但它没有任何可接受的答案,所以我认为可以再次询问。
解决方案
我可以获取文件路径而不是录制视频的 uri 吗?
不需要将视频记录为文件系统上的文件,更不用说在您可以通过文件系统 API 访问的位置。
如果返回的方案Uri
恰好是file
,那么getPath()
将返回文件的文件系统路径。但是,不能保证您可以使用该文件,并且该file
方案自 Android 7.0 以来已在很大程度上被禁止。
该计划更有可能成为content
. 这Uri
可能指向:
- 您的应用可以读取的外部存储上的本地文件
- 外部存储上的本地文件,但在您的应用将无法读取的位置
- 另一个应用程序的内部存储上的本地文件
- 可移动存储上的本地文件
- 已加密且需要即时解密的本地文件
- 保存在数据库的 BLOB 列中的字节流
- 需要先被其他app下载的一段内容
- ...等等
而且,就像使用https
URL 一样,没有神奇的方法可以将路径部分转换Uri
为某个文件系统路径。
我需要文件系统路径,因为我想稍后使用 FFmpeg 处理它
我将首先查看是否有人拥有可以与Uri
.
如果这不可用,那么您将需要在您控制的文件中制作内容的副本:
- 使用
ContentResolver
andopenInputStream()
获取InputStream
内容,传入你的Uri
- 打开
FileOutputStream
某个文件(例如,在 中getCacheDir()
) - 将字节从 复制
InputStream
到FileOutputStream
(Kotlin 有一些很棒的扩展函数)
或者,与其使用ACTION_VIDEO_CAPTURE
,不如使用相机库并直接在您的应用程序中拍摄视频,而不是尝试依赖第三方应用程序来拍摄视频。
推荐阅读
- excel - 基于单元格中的值的图表范围
- android - 窗口管理器视图不可见
- docker - Docker-compose 说无法打开文件 - 目录上没有文件,但文件存在
- typescript - 从扩展接口扩展联合类型
- javascript - 用 Jest 模拟 shelljs - [TypeError: shell.exec 不是函数]
- python-3.x - Python中没有任何输入的“输入”按键代码
- jenkins - 使用jenkins为量角器生成'Allure Report' - 错误“'Allure Report'由于异常而中止:java.io.IOException:”
- c# - 如何配置 Swashbuckle 以针对请求和响应以不同方式忽略模型上的属性
- ansible - 如何安装-t?
- html - HTML CSS:来自不同行的多个 DIV 的边框