保存的视频不会出现在相册中

问题描述:

我希望有人能帮助我解决这个问题。保存的视频不会出现在相册中

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

问题是,考虑到视频工作正常,我可以在我的应用程序中预览完成的视频。但是同样的视频不会出现在媒体库中,其他应用程序无法访问 - 除了FileManager-,即使同一文件夹中的其他.mp4出现在列表中也没问题。

更多信息

  • 在文件管理器应用程序,则未出现文件有图标视频图标,而那些出现了一个缩略图。我可以通过在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); 
} 

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 

尝试使用此功能

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'只是关于视频的元数据

+0

谢谢!这工作!你能解释一下为什么这会起作用吗?元数据是?但是当我保存视频时,我认为元数据已经存在... –

+0

是的,它是元数据。没有这个只有一个无用的文件将被保存在sdcard.videoFile是只有原始数据,如果我们不设置至少这些参数 –

+0

嗯,所以我想当我保存,它不会自动创建/添加Android的呃...谢谢你解释@Abdullah! –