6

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はおそらく実際のファイルのサイズを教えてくれます。

SOのこの投稿を参照してください。

さまざまな投稿を確認したところ、コンテンツ プロバイダーを通じてビデオの InputStream を取得し、ファイルを保存して、ファイルを操作する必要があると考えました。ただし、画像ファイルの選択は問題なく機能しますが、ビデオの場合は機能しません。

したがって、ストリームをファイルにコピーするには、次のコードがあります。

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

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

上記の URI の最後の部分から URL を取得し、ブラウザーで表示しようとすると、GIF ファイルがダウンロードされます。それが問題だと思います。しかし、ビデオのmpeg形式を取得する方法がわかりません。

誰も同じことを経験しましたか?

4

1 に答える 1

10

最後に、問題の解決策を見つけました。これは、画像とビデオの両方で機能します。

この動画を参考にしました:

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

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

インテント インテント = 新しいインテント(Intent.ACTION_GET_CONTENT);
インテント.setType("画像/*");
startActivity(意図);

Uri を取得し、次のようにファイルにアクセスして保存します。

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

FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();

InputStream inputStream = new FileInputStream(fileDescriptor);

BufferedInputStream リーダー = new BufferedInputStream(inputStream);

// 保存先のファイルへの出力ストリームを作成します
BufferedOutputStream outStream = new BufferedOutputStream(
                    新しい FileOutputStream(filePath));
バイト[] buf = 新しいバイト[2048];
int レン;
while ((len = reader.read(buf)) > 0) {
    outStream.write(buf, 0, len);
}

何らかの理由で、ParcelFileDescriptor を使用せずに入力ストリームを取得すると機能しません。

于 2014-01-08T09:59:20.243 に答える