2016-12-07 27 views
0

誰かがこの問題を助けてくれることを願っています。保存されたビデオはギャラリーに表示されません

私は、ユーザーがビデオ(.mp4)を撮ったり、既存のものを選ぶことを可能にするアプリを持っています。ビデオを撮影する場合、ビデオはパブリックディレクトリに保存され、アンドロイドがファイルをスキャンしてメディアギャラリーに追加するようにトリガしました。

問題はです。ビデオがうまくいけば、完成したビデオをアプリでプレビューできます。しかし、この同じビデオはメディアギャラリーには表示されず、同じフォルダ内の他の.mp4がリストに表示されているにもかかわらず、FileManager以外の他のアプリケーションからアクセスできなくなります。

さらに詳細:FileManagerのアプリで

  • 登場するものは、サムネイルを得ながら、-表示されていないファイルは、アイコンビデオアイコンを持っています。私はFileManagerアプリでファイルをカットアンドペーストすることでメディアギャラリーアプリに追加されるこれらの出現しないファイルをトリガーすることができます(私はファイルが破損しているとは思わない)。
  • スキャンコードは、既存のカメラアプリから画像を撮る私のコードのために正常に動作し、それだけでビデオのもののために動作しません...

は仕事に、このための追加の許可の必要があります?私は追加/尋ねる/要求の書き込みとextからの読み取りの許可をしました。ストレージとカメラを私のマニフェストとコードに入れてください。上記のコードで各ログの

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 

答えて

2

はこの機能

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); 
} 
を使用してみてください、私はビデオを取ると、ギャラリーにそれをスキャンする方法をこれ以下

です

「値」は単にビ​​デオに関するメタデータです

+0

ありがとうございました!これは動作します!なぜこれがうまくいくのか説明できますか?メタデータはありますか?しかし、私はビデオが保存されたときにメタデータが既にそこにあると思った... –

+0

はいメタデータです。これがなければ、無用なファイルだけがsdcard.videoファイルに保存されます。少なくとも、これらのパラメータを設定しないと生データです。 –

+0

うーん、私が保存したときに自動的に作成されない/追加されたと思います...ありがとう@アブドラを説明しよう! –

関連する問題