我希望有人能够帮助我解决这个问题。
我的应用程序允许用户拍摄视频(.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