0
 @Throws(IOException::class)
private fun createVideoFile(): File {
    // Create an image file name
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_MOVIES)
    return File.createTempFile(
        "oogoo_${timeStamp}_",
        ".mp4",
        storageDir
    ).apply {
        videoPath = this.path
        videoUri = this.toUri()
    }
}

我正在使用 CameraView 录制 Video 。当停止记录我得到记录路径

D/VideoTaken:/storage/emulated/0/Android/data/com.example.testgogoapplication/files/Movies/oogoo_20211021_125639_3062139219833544197.mp4

file:///storage/emulated/0/Android/data/com.example.testgogoapplication/files/Movies/oogoo_20211021_125639_3062139219833544197.mp4

put not found this path in Device 怎么能访问到这个路径?

如果 Kotlin 有另一种方法可以将视频保存到存储中(写入文件的最佳方法)

4

1 回答 1

0

用这个:

    private fun createVideoOutputPath(context: Context): String {
        val contentResolver = context.contentResolver

        /** Represent the videos collection */
        val videosCollection: Uri = sdkAndUp(29) { // if sdk is 29 or higher
            MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
        } ?: MediaStore.Video.Media.EXTERNAL_CONTENT_URI

        /** Represents the data values of the video to be saved */
        val contentValues = ContentValues()

        // Adding the file title to the content values
        contentValues.put(
            MediaStore.Video.Media.TITLE,
            "VID_" + System.currentTimeMillis() + ".mp4"
        )
        // Adding the file display name to the content values
        contentValues.put(
            MediaStore.Video.Media.DISPLAY_NAME,
            "VID_" + System.currentTimeMillis() + ".mp4"
        )
        /** Represents the uri of the inserted video */
        val videoUri = contentResolver.insert(videosCollection, contentValues)!!
        // Opening a stream on to the content associated with the video content uri
        contentResolver.openOutputStream(videoUri)
        /** Represents the file path of the video uri */
        val outputPath = getUriRealPath(context, videoUri)!!
        // Deleting the video uri to create it later with the actual video
        contentResolver.delete(videoUri, null, null)
        return outputPath
    }

    private fun getUriRealPath(contentResolver: ContentResolver, uri: Uri): String {
        var filePath = ""
        val cursor = contentResolver.query(uri, null, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                var columnName = MediaStore.Images.Media.DATA
                when (uri) {
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI -> {
                        columnName = MediaStore.Images.Media.DATA
                    }
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI -> {
                        columnName = MediaStore.Video.Media.DATA
                    }
                }
                val filePathColumnIndex = cursor.getColumnIndex(columnName)
                filePath = cursor.getString(filePathColumnIndex)
            }
            cursor.close()
        }
        return filePath
    }

此代码将视频 uri 插入到MediaStore,检索其文件路径,并将其从MediaStore. 此路径将指向公开且不需要权限的 Movies 目录。现在您可以使用此文件路径创建一个File对象,如下所示: val file = File(createVideoOutputPath(context))

于 2021-10-24T01:23:18.067 回答