保存的视频未出现在相册中。

6

我希望有人能够帮助我解决这个问题。

我的应用程序允许用户拍摄视频(.mp4)或选择现有视频。如果拍摄视频,则将视频保存到公共目录,并触发Android扫描文件以将其添加到媒体库。

问题是,拍摄的视频正常工作,在我的应用程序中可以预览完成的视频。但是,这个视频不会出现在媒体库中,也不可被其他应用程序访问 - 除了 FileManager 应用程序外 - 即使同一文件夹中的其他 .mp4 文件可以正常显示。

更多信息:

  • 在 FileManager 应用程序中,未出现的文件具有视频图标,而出现的文件则具有缩略图。我可以通过在 FileManager 应用程序中剪切和粘贴文件来触发这些未出现的文件添加到媒体库应用程序中(因此我认为不是由于文件损坏导致的)。
  • 扫描代码对从现有相机应用程序中获取图像的代码有效,但对于视频则无效...

是否需要其他权限才能使此功能正常工作?我已在我的清单文件和代码中添加/请求了读取和写入扩展存储和相机的权限。

以下是我如何拍摄视频并将其扫描到媒体库中:

private void takeVideo() {
    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

    if (takeVideoIntent.resolveActivity(ctx.getPackageManager()) != null) {

        // Create the file where photo should go
        File mediaFile = null;

        try {
            mediaFile = getOutputMediaFile(ctx, MEDIA_TYPE_VIDEO);

        } catch (IOException ex) {
            Log.e("FragCamera", "takeVideo() : Error occurred while creating File." + ex);
        }

        if (mediaFile != null) {
            Uri mediaUri = Uri.fromFile(mediaFile);

            Log.d("FragCamera", "takeVideo() mediaUri: " + mediaUri);

            currMediaUri = mediaUri;
            currPhotoPath = mediaFile.getAbsolutePath();
            Log.d("FragCamera", "takeVideo() currPhotoPath: " + currPhotoPath);

            //make the new file available for other apps
            updateMediaGallery(mediaFile);

            MediaScannerConnection.scanFile(
                    ctx,
                    new String[]{currPhotoPath},
                    new String[]{"video/mp4"},
                    new MediaScannerConnection.OnScanCompletedListener() {
                        @Override
                        public void onScanCompleted(String path, Uri uri) {
                            Log.v("FragCameraScan",
                                    "file " + path + " was scanned seccessfully: " + uri);
                        }
                    });

            takeVideoIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mediaUri);
            this.startActivityForResult(takeVideoIntent, I_REQUEST_VIDEO_CAPTURE);
        }

    }
}

private void galleryAddPic(String filePath) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(filePath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    ctx.sendBroadcast(mediaScanIntent);
}

上面代码中每个 Log 的 Logcat 值:

 D/FragCamera: takeVideo() mediaUri: file:///storage/emulated/0/DCIM/Camera/VID_20161207_142021.mp4
 D/FragCamera: takeVideo() currPhotoPath: /storage/emulated/0/DCIM/Camera/VID_20161207_142021.mp4
 V/FragCameraScan: file /storage/emulated/0/DCIM/Camera/VID_20161207_142021.mp4 was scanned seccessfully: null
1个回答

16

试着使用这个函数

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);
}

'values' 只是关于视频的元数据。


谢谢!这个有效!但是你能解释一下为什么有效吗?是元数据的原因吗?但我认为当我保存视频时,元数据已经存在了... - ayakashi-ya
是的,这是元数据。如果没有它,只会在SD卡上保存一个无用的文件。如果我们不设置至少这些参数,videoFile只是原始数据。 - Abdullah Raza
嗯,所以我猜当我保存时,它没有被Android自动创建/添加...谢谢你的解释@Abdullah! - ayakashi-ya
我能找到的最好解决方案之一。 - Sushin Pv
1
你四年前的回答帮了我很多,谢谢你。愿上帝保佑你。 - Vikash Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接