首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >视频将不会显示在使用FileProvider和MediaScan的安卓24上的照片中

视频将不会显示在使用FileProvider和MediaScan的安卓24上的照片中
EN

Stack Overflow用户
提问于 2020-07-27 06:26:18
回答 1查看 86关注 0票数 1

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

创建Intent.ACTION_MEDIA_SCANNER_SCAN_FILE和sendBroadcast时,视频无法显示。如果我使用MediaScannerConnection,它不会显示。如果我使用内容URI使用内容解析器手动插入,它会显示在Photos中,但视频不能播放,也没有预览。如果我手动插入带有绝对路径的内容解析器,它根本不会在照片中显示下面是我用来拍摄视频并添加到MediaStore的代码

文件提供程序

代码语言:javascript
运行
复制
    <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>

文件提供程序路径

代码语言:javascript
运行
复制
<?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>

创建文件并调用Intent以捕获视频的方法

代码语言:javascript
运行
复制
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和绝对路径,但没有成功

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

代码语言:javascript
运行
复制
    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
            }

我已经在Stack上看过很多浏览器了,但都没有用。非常感谢您的任何帮助。

Video not shown on Gallery

MediaScanner and ScopedStorage on SDK-29

MediaStore.ACTION_VIDEO_CAPTURE not saving the video in Nougat 7.0

ACTION_MEDIA_SCANNER_SCAN_FILE from external sdcard Lollipop+

Saving photos and videos using Android FileProvider to the gallery

android - save image into gallery

MediaScannerConnection doesn't work

Android How to use MediaScannerConnection scanFile

Android MediaStore insertVideo

Capturing and Saving Videos in Android (API > 24) using File object?

EN

回答 1

Stack Overflow用户

发布于 2020-08-13 07:37:04

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63106392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档