kotlin 如何将文件保存到存储(Android 13 -API 33)

bq9c1y66  于 2023-05-23  发布在  Kotlin
关注(0)|答案(2)|浏览(323)

我正在为我的应用程序做屏幕录制功能。所以,我需要将视频MP4文件保存到外部存储。我的函数在API 32及更低版本上有效,但在API 33上不起作用。请演示解决此问题的步骤。

um6iljoc

um6iljoc1#

从API级别29开始,为了提高用户隐私和安全性,访问外部存储已经受到限制,因此如果您的应用程序使用API级别32,那么我猜您已经在清单中添加了存储权限,并且在运行时请求它们。
我在我的应用程序中有代码片段,可以执行您想要的相同功能。

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    type = "video/mp4"
    putExtra(Intent.EXTRA_TITLE, "my_video.mp4")
}

startActivityForResult(intent, CREATE_DOCUMENT_REQUEST_CODE)

Intent与操作ACTION_CREATE_DOCUMENT一起创建新文档。指定类别CATEGORY_OPENABLE以允许用户选择位置。类型指定文件的MIME类型。在这个例子中,我们使用“video/mp4”。putExtra方法用于指定默认文件名。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == CREATE_DOCUMENT_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        val uri: Uri? = data?.data
        if (uri != null) {
            // Save the video file to the chosen location
            saveVideoToUri(uri)
        }
    }
}

结果是RESULT_OK。如果是,我们检索所选位置的Uri并将其传递给saveVideoToUri函数。

fun saveVideoToUri(uri: Uri,context:Context) {
    try {
        context.contentResolver.openOutputStream(uri)?.use { outputStream ->
            // Write the video data to the output stream
            outputStream.write(videoData)
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
}
nhn9ugyo

nhn9ugyo2#

1.清单中需要这两个权限,并以编程方式向用户请求权限

<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

1.在Android R+中,您无法访问没有MANAGE_EXTERNAL_STORAGEsee documentation here的存储,但您可以访问共享存储,如Downloads和您的应用文件夹。
1.现在你可以用下面的代码创建你的文件夹目录

fun createAppDirectoryInDownloads(context: Context): File? {
     val downloadsDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
     val appDirectory = File(downloadsDirectory, "YourAppDirectoryName")

     if (!appDirectory.exists()) {
         val directoryCreated = appDirectory.mkdir()
         if (!directoryCreated) {
             // Failed to create the directory
             return null
         }
     }

     return appDirectory
 }

1.现在创建您的视频文件在您的目录使用下面的代码

companion object {
 @JvmStatic
 fun createFileInAppDirectory(context: Context, fileName: String): File? {
     val appDirectory = createAppDirectoryInDownloads(context)
     if (appDirectory != null) {
         val file = File(appDirectory, fileName)
         try {
             if (!file.exists()) {
                 val fileCreated = file.createNewFile()
                 if (!fileCreated) {
                     // Failed to create the file
                     return null
                 }
             }
             return file
         } catch (e: IOException) {
             e.printStackTrace()
         }
     }
     return null
 }

这对我来说很有效,我只是希望你的问题能解决。

相关问题