5

Googleフォトアプリで、ビデオを選択しようとしていますが、そのビデオはデバイスにキャッシュされていません。Googleフォトアプリからビデオを取得する

ACTION_GET_CONTENTインテントを使用してオプションダイアログを起動し、Googleフォトアプリを選択します。

ローカルビデオを選択するときに、このフォームでUriを返します。

内容://メディア/外部/ビデオ/メディア/ 6708

そして、それから、私は、実際のファイルの場所を取得し、そこから続行するコンテンツプロバイダに問い合わせを。ファイルの場所は次のようになります。

/ストレージ/エミュレート/ 0 /のWhatsApp /メディア/のWhatsApp ビデオ/ VID-20131102-WA0000.mp4

さて、私はオンラインビデオ、すなわちを選択した場合:上のビデオは利用できません私はまだ、デバイス、及びその使用するためにダウンロードする必要があり、返されたURIは次のようになります。

内容://com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d

これで、このビデオへの実際のリンクを取得するのに役立つ、文書化されたContentProviderはありません。クエリを実行しても、DISPLAY_NAME列とSIZE列以外は何も返しません。

DISPLAY_NAMEはvideo.mpeg(別の動画に同じ表示名)は、おそらく私の実際のファイルのサイズを伝えます

SIZEが含まれています。

Referred to this post on SO.

私は様々な記事をチェックし、私は、コンテンツ・プロバイダを介してビデオのためのInputStreamを取得する必要があり、ファイルを保存し、ファイルに働くだろうと思いました。しかし、画像ファイルを選ぶことはうまくいきますが、ビデオではうまくいきません。

ストリームをファイルにコピーするには、このコードが必要です。

 
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path)); 

最後に、一時ファイルに書き込みます。ファイルは作成されますが、正しくフォーマットされていないようです。 VLCはファイルを再生しますが、全体を通して最初のフレームのみを表示します。

上記のURIの最後の部分からURLを取得してブラウザで表示しようとすると、GIFファイルがダウンロードされます。私はそれが問題だと思っています。しかし、私はどのようにmpegビデオのフォーマットを取得するのか分からない。

誰もが同じことを経験していますか?

答えて

5

最後に、問題の解決策が見つかりました。これは画像と動画の両方で機能します。

DevBytes:アンドロイド4.4ストレージアクセスフレームワーク:クライアント

https://www.youtube.com/watch?v=UFj9AEz0DHQ

 
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType("image/*"); 
startActivity(intent); 

がウリ、およびアクセスを取得し、このようなファイルを保存します。

この動画を参考に

 
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver() 
       .openFileDescriptor(Uri.parse(path),"r"); 

FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 

InputStream inputStream = new FileInputStream(fileDescriptor); 

BufferedInputStream reader = new BufferedInputStream(inputStream); 

// Create an output stream to a file that you want to save to 
BufferedOutputStream outStream = new BufferedOutputStream(
        new FileOutputStream(filePath)); 
byte[] buf = new byte[2048]; 
int len; 
while ((len = reader.read(buf)) > 0) { 
    outStream.write(buf, 0, len); 
} 

何らかの理由で、ParcelFileDescriptorを使用せずに入力ストリームを取得できません。

+0

大変ありがとうございました。これは大変助けになりました! 関連する質問と回答があります: http://stackoverflow.com/q/30572261/3309883 –

関連する問題