私の目標:
ビデオと JS ファイルを含む zip ファイルをダウンロードします。ビデオ ファイルを再生するためのビデオ タグを含む JS ファイルを実行する Web ビューを作成します。
問題: ビデオを再生しようとすると、「申し訳ありませんが、このビデオは再生できません」というエラーが表示されます。logcat で次のように表示されます: error( 1, -2147483648)
ファイルを解凍するコードは次のとおりです。
String path = context.getFilesDir().getPath()+"/";
InputStream is;
ZipInputStream zis;
try {
is = new FileInputStream(zip file);
zis = new ZipInputStream( new BufferedInputStream(is));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
String filename = ze.getName();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
FileOutputStream fout =
_context.openFileOutput( path + filename, Context.MODE_WORLD_READABLE );
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
baos.toByteArray();
fout.write(baos.toByteArray());
baos.reset();
}
fout.close();
zis.closeEntry();
baos.close();
}
zis.close();
}
ビデオを表示するには、MraidWebChromeClient.onShowCustomView をオーバーライドします。
super.onShowCustomView(view, callback);
if (view instanceof FrameLayout) {
FrameLayout frame = (FrameLayout) view;
if (frame.getFocusedChild() instanceof VideoView) {
VideoView video = (VideoView) frame.getFocusedChild();
frame.removeView(video);
Activity a = (Activity)getContext();
a.setContentView(video);
video.setOnCompletionListener(this);
video.setOnErrorListener(this);
video.start();
}
}
次の理由により、動画ファイル、パス、または JS にエラーがあるとは思いません。
- res のリソースとして含まれているか、外部 http リンクでストリーミングされている場合、ビデオは正常に再生されます。
- js ファイルをロードするときに loadDataWithBaseURL を使用すると、他のすべての画像要素が正常に表示されます。
- res からローカル アプリ フォルダーにファイルをコピーしました (解凍コードと同様のコードを使用) が、同じエラーが発生します。
私は次のいずれかを考えています:
- 解凍/コピー中にファイルが破損している
- webviewからローカル ビデオを再生するためのアクセス許可の問題があります (ファイルを world_readable に設定した後でも) 。
この問題に関する洞察をいただければ幸いです。
K
Ps: 通常の Web ブラウザでは .mp4 リンクをダウンロードし、それ以外の場合はそれらをストリーミングしようとする理由を知っている人はいますか?
編集:これらの 2 つの投稿を調査した後、Android にはこれを防ぐためのセキュリティがあることが示唆されているようです: Android - アプリのプライベート フォルダーからビデオを 読み込む Web ビューでアプリのローカル ビデオ (.mp4) を再生 する
Ps に関しては、なぜ一部の動画がストリーミングされ、一部がダウンロードされるのか、Android 3 は https からのストリーミングをサポートしていないため、ファイルをダウンロードします。