当前位置: 首页 > 知识库问答 >
问题:

在使用FileProvider和MediaScan的Android 24上,视频不会显示在照片中

蒋鸿文
2023-03-14

我有点被困在这个问题上,已经工作了一段时间,但没有运气。我有一个允许用户拍摄照片/视频的android应用程序。文件使用FileProvider存储在外部存储中。我一直在尝试(运气不好)让视频显示在照片应用程序中,但一直无法。意图。ACTION_MEDIA_SCANNER_SCAN_FILE和sendBroadcast非常适合图像,但不适用于视频。我知道视频正在被捕获,它们被保存在正确的位置,并且没有损坏(我可以使用FileProvider内容Uri在VideoView中播放它们)我还没有尝试将其更新到Android 10,因为我的最低目标是24,我似乎无法让它为此工作。

创建意图。ACTION\u MEDIA\u SCANNER\u SCAN\u FILE and sendBroadcast视频未显示。如果我使用MediaScannerConnection,它不会显示。如果我使用内容URI手动插入内容解析器,它会显示在照片中,但视频无法播放,也没有预览。如果我用绝对路径手动插入到内容解析器中,它根本不会显示在下面的照片中,这是我用来拍摄视频并添加到MediaStore的代码

文件提供者

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

文件提供程序路径

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="Image" path="Image" />
    <external-files-path name="Recording" path="Recording"/>
    <external-files-path name="Video" path="Video"/>
</paths>

创建文件和调用意图以捕获视频的方法

private fun takeVideo() {

        Intent(MediaStore.ACTION_VIDEO_CAPTURE).also{ videoIntent ->
            val videoFile: File? = try{
                createVideoFile()
            }catch(ex: IOException){
                Toast.makeText(mMainActivityHelper.contextProvider(), R.string.error_taking_photo, Toast.LENGTH_SHORT).show()
                Log.w("OPENING_VIDEO_FILE", "Error opening video file with message = " + ex.message)
                return
            }
            mFilePath = Uri.parse(videoFile?.absolutePath)
            videoFile?.also{
                videoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                mFileUri = FileProvider.getUriForFile(mMainActivityHelper.contextProvider(), "FileProvider", it)
                videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri)
           mMainActivityHelper.startActivityForResult(videoIntent, MainActivity.TAKE_VIDEO)
       }
   }
}



@Throws(IOException::class)
private fun createVideoFile(): File? {
    val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
    val externalDir = mMainActivityHelper.externalFilesDirProvider(null)
    val imagePath = File(externalDir, "NuNoteVideo")

    if(!imagePath.exists())
        imagePath.mkdir()

    return File(imagePath.path, "MPEG_${timeStamp}" + ".mp4")
}

OnActivityResult代码我已经试过了,但都没有成功。我尝试了内容URI和绝对路径,但都没有成功

覆盖活动结果(请求代码:Int,结果代码:Int,数据:Intent?){super.onActivityResult(请求代码、结果代码、数据)

    when{
          requestCode == TAKE_VIDEO && resultCode == Activity.RESULT_OK->{

            val cv = ContentValues(3).apply {
                val absolutePath = myObjectWithThePath.mFilePath.toString()
                val name = absolutePath.substring(absolutePath.lastIndexOf("/") + 1)
                put(MediaStore.Video.Media.TITLE, name)
                put(MediaStore.Video.Media.DISPLAY_NAME, name)
                put(MediaStore.Video.Media.MIME_TYPE, "video/mp4")
                put(MediaStore.Video.Media.DATE_ADDED, Date().time)
                put(MediaStore.MediaColumns.DATA, absolutePath)
                contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, this)
            }

            Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE).also { mediaScanIntent ->
                val fileUri = myObjectWithThePath.mFileUri

                if(fileUri != null) {
                    val f = File(fileUri)
                    mediaScanIntent.data = Uri.fromFile(f)
                    //mediaScanIntent.type = "video/mp4"
                    sendBroadcast(mediaScanIntent)
                }
            }

            val f = File(myObjectWithThePath.mFilePath.toString())

            MediaScannerConnection.scanFile(applicationContext, listOf(f.absolutePath).toTypedArray(), listOf("video/mp4").toTypedArray()){
                path, uri ->

                print(path)
                print(uri) //This shows a URI if i use the absolute path but nothing shows up in the photos app. If i use content uri with FileProvider is null
            }

我已经研究了堆栈上的许多anwser,但什么都没用。非常感谢您的帮助

图库上未显示视频

SDK-29上的MediaScanner和ScopedStorage

MediaStore。操作\u视频\u捕获未在牛轧糖7.0中保存视频

ACTION\u MEDIA\u SCANNER\u SCAN\u文件来自外部SD卡Lollipop

使用Android FileProvider将照片和视频保存到图库

android-将图像保存到图库

MediaScannerConnection不工作

Android如何使用MediaScannerConnection扫描文件

Android MediaStore insertVideo

在Android(API)中捕获和保存视频

共有1个答案

慕才
2023-03-14

发布更新。我通过在不提供文件路径的情况下创建视频来解决这个问题。这会在DCIM文件夹中创建视频。创建视频时,我保存uri,并查询uri以确保它在应用程序的加载中仍然存在。不完全是我想要的,但它会起作用

 类似资料:
  • 我的应用程序(使用SDK小于24)可以使用相机拍照和视频。这些照片和视频可以在应用程序外的图库中查看。SDK 24及以上版本要求FileProvider创建uri,以便将照片或视频保存到多媒体资料中。 在SDK 24之前,我会使用uri和拍照意图: 使用SDK24及更高版本会出现异常: 我想使用FileProvider实现同样的目标(没有例外)。下面的实现可以拍照,但照片不会出现在图库中。我想知道

  • 我刚刚接触Android,最近我在我的应用程序中添加了一个CardView来显示一些文本框和图像,效果很好。 然而,当我试图显示视频时,卡仍然是空的。有人能帮我理解我做错了什么吗? 我这样定义了图像视图: 最初,我尝试将视频设置为相关活动的onCreate,如下所示: 那不起作用,不知道为什么。所以从相关的中,我使用从URL获取视频。由于UI更改,在onProgressMethod中使用相同的代码

  • 了解如何将 Apple 照片图库迁移到 Lightroom - Adobe 的全新一体化服务,专为摄影爱好者设计。 准备要进行迁移的 Apple 照片图库 请确保将您要迁移的 Apple 照片图库设置为“系统照片图库”。要将图库设置为“系统照片图库”,请执行以下步骤: 打开 Apple 照片,并在菜单栏中选择偏好设置。 单击通用标签,然后在图库位置下方选择用作系统照片图库。 选择“用作系统照片图库

  • 以下是我到目前为止的布局: 我尝试通过编程方式向FrameLayout添加一个ImageButton,但这似乎不起作用。

  • 我是Firebase (web)的新手,尝试在img标签的视图中显示用户的照片URL。类似于: 通过id获取元素并更改src属性的JavaScript是什么? 我使用这里的基本示例:https://github.com/firebase/FirebaseUI-Web#using-用于身份验证的firebaseui 谢谢

  • 我正在用FileProvider在Android牛轧糖上拍照,这是我的代码 file_paths.xml: 编辑丢失的文件#createNewFile();