Android MediaStore 插入视频

Posted

技术标签:

【中文标题】Android MediaStore 插入视频【英文标题】:Android MediaStore insertVideo 【发布时间】:2010-01-22 00:47:47 【问题描述】:

所以我们的应用可以选择拍摄照片或视频。如果用户拍照,我们可以使用 MediaStore.Images.Media.insertImage 函数将新图像(通过文件路径)添加到手机的图库并生成 content:// 样式的 URI。鉴于我们只有文件路径,对于捕获的视频是否有类似的过程?

【问题讨论】:

***.com/questions/1925502/… 的可能重复项。我在那里发布了回复。 【参考方案1】:

这是一个简单的“基于单个文件的解决方案”:

每当您添加一个文件时,让 MediaStore Content Provider 知道它使用

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAdded)));

主要优势:使用 MediaStore 支持的任何 mime 类型

每当您删除一个文件时,让 MediaStore Content Provider 知道它使用

getContentResolver().delete(uri, null, null)

【讨论】:

关于获取内容样式 URI 的问题。你是怎么得到的? 我正在寻找扫描视频文件。这对你有影响吗? @qix 哦..我只是尝试使用图像。将尝试使用视频,但现在没有机会测试。 在调用它之前文件应该存储在特定位置吗? AFAIK 文件可以位于任何地方【参考方案2】:

我也有兴趣,你能找到解决办法吗?

编辑:解决方案是 RTFM。基于“内容提供者”一章,这是我的有效代码:

        // Save the name and description of a video in a ContentValues map.  
        ContentValues values = new ContentValues(2);
        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
        // values.put(MediaStore.Video.Media.DATA, f.getAbsolutePath()); 

        // Add a new record (identified by uri) without the video, but with the values just set.
        Uri uri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

        // Now get a handle to the file for that record, and save the data into it.
        try 
            InputStream is = new FileInputStream(f);
            OutputStream os = getContentResolver().openOutputStream(uri);
            byte[] buffer = new byte[4096]; // tweaking this number may increase performance
            int len;
            while ((len = is.read(buffer)) != -1)
                os.write(buffer, 0, len);
            
            os.flush();
            is.close();
            os.close();
         catch (Exception e) 
            Log.e(TAG, "exception while writing video: ", e);
         

        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));

【讨论】:

回复:已发布解决方案。请注意,Java 有 BufferedInputStream 和 BufferedOutputStream,因此您不必自己这样做。 这个怎么样:developer.android.com/reference/android/media/…【参考方案3】:

如果您的应用正在生成新视频,而您只是想为 MediaStore 提供一些元数据,则可以在此函数的基础上进行构建:

public Uri addVideo(File videoFile) 
    ContentValues values = new ContentValues(3);
    values.put(MediaStore.Video.Media.TITLE, "My video title");
    values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    values.put(MediaStore.Video.Media.DATA, videoFile.getAbsolutePath());
    return getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

编辑:从 Android 4.4 (KitKat) 开始,此方法不再有效。

【讨论】:

***.com/questions/2114168/… 是的,整个媒体存储/提供程序系统在 4.4 中进行了大修。任何针对 4.4+ 的人都应该寻找更现代的解决方案。 FWIW,我认为这不值得对这个古老问题的答案投反对票。 感谢您的回复,并对不赞成投票感到抱歉,但由于这个答案,我花了大约 0.5 小时没有去任何地方,我认为让 Android 开发人员不要这样做是件好事。我希望你明白。我不认为针对较低的 API 会有所不同,因为 Android 团队不会投入任何时间来为之前发生的未记录/不受支持的行为创建兼容性措施。删除该答案会从否决票中恢复这些点吗?如果没有,我也可以在删除之前删除反对票。 哦,发送广播对我有用:***.com/a/14849684/501940 即使在 Android P 上仍然可以工作,我想知道为什么它提到它不会在 4.4+ 上工作【参考方案4】:

我无法让 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 广播在 API 21 (Lollipop) 下为我工作,但 MediaScannerConnection 确实有效,例如:

        MediaScannerConnection.scanFile(
                context, new String[]  path , null,
                new MediaScannerConnection.OnScanCompletedListener() 
                    public void onScanCompleted(String path, Uri uri) 
                        Log.d(TAG, "Finished scanning " + path + " New row: " + uri);
                    
                 );

【讨论】:

【参考方案5】:

试试这个代码。它似乎对我有用。

 filePath = myfile.getAbsolutePath();
 ContentValues values = new ContentValues();
 values.put(MediaStore.Video.Media.DATA, filePath);
 return context.getContentResolver().insert(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

文件路径示例 -

/storage/emulated/0/DCIM/Camera/VID_20140313_114321.mp4

【讨论】:

这段代码返回 null,最新的 KitKat,Nexus 5。我猜它只适用于媒体商店中已经存在的视频,所以它更像是查询而不是插入... VID_20140313_114321 和路径建议因为它是标准相机应用在捕捉视频时的标准路径和命名。

以上是关于Android MediaStore 插入视频的主要内容,如果未能解决你的问题,请参考以下文章

Android之MediaStore

MediaStore.EXTRA_VIDEO_QUALITY不适用于Android视频捕获

用于捕获图像和视频的 Android 意图?

Android开发之获取本地视频和获取自拍视频

需要 MediaStore.ACTION_VIDEO_CAPTURE 创建 MP4 视频

如何通过lua脚本及时更新Android MediaStore?