Google フォト アプリで、デバイスにキャッシュされていない動画を選択しようとしています。
ACTION_GET_CONTENTインテントを使用してオプション ダイアログを起動し、そこから Google フォト アプリを選択します。
ローカル ビデオを選択している間、この形式で Uri を返します。
content://media/external/video/media/6708
それから、コンテンツ プロバイダーにクエリを実行して実際のファイルの場所を取得し、そこから処理を進めます。ファイルの場所はこんな感じ。
/storage/emulated/0/WhatsApp/Media/WhatsApp Video/VID-20131102-WA0000.mp4
ここで、オンライン ビデオ、つまり、デバイスでまだ利用できず、使用するためにダウンロードする必要があるビデオを選択すると、返される Uri は次のようになります。
content://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はおそらく実際のファイルのサイズを教えてくれます。
さまざまな投稿を確認したところ、コンテンツ プロバイダーを通じてビデオの InputStream を取得し、ファイルを保存して、ファイルを操作する必要があると考えました。ただし、画像ファイルの選択は問題なく機能しますが、ビデオの場合は機能しません。
したがって、ストリームをファイルにコピーするには、次のコードがあります。
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path));
最後に一時ファイルに書き込みます。ファイルは作成されますが、正しくフォーマットされていないようです。VLC はファイルを再生しますが、全体を通して最初のフレームのみを表示します。
上記の URI の最後の部分から URL を取得し、ブラウザーで表示しようとすると、GIF ファイルがダウンロードされます。それが問題だと思います。しかし、ビデオのmpeg形式を取得する方法がわかりません。
誰も同じことを経験しましたか?