0

私の目標:

ビデオと 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 からのストリーミングをサポートしていないため、ファイルをダウンロードします。

4

1 に答える 1

0
  1. SD カードとの間でビデオを解凍/読み取りしているので、必ず次の行をマニフェスト ファイルに追加してください。<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  2. JS を使用しているため、次のように WebView で有効にしてください。

    private WebView mWebView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ...
            ...
            mWebView = (WebView) findViewById(R.id.webview);
            mWebView.getSettings().setJavaScriptEnabled(true);
            ...
    }
    
  3. ビデオの再生に関しては、これまでに見つけた最も信頼できる解決策は、ネイティブ メディア プレーヤー アプリに渡すことです (WebView には非常にバグがあることがわかりました)。これを実現するには、JavaScript コードを Android コードにバインドして、ユーザーが動画のサムネイルをタップしたときに対応するインテントを作成し、次のようにメディア プレーヤー アプリを起動する必要があります。

    Intent i = new Intent();
    i.setAction(android.content.Intent.ACTION_VIEW);
    File file = new File(PATH_TO_YOUR_VIDEO);
    i.setDataAndType(Uri.fromFile(file), "video/*");
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    mContext.startActivity(i);
    
  4. [更新]公式ドキュメント(「外部ストレージ上のファイルへのアクセス」を参照) に従って、

API レベル 8 以上を使用している場合は、 getExternalFilesDir()を使用して、ファイルを保存する外部ストレージ ディレクトリを表すファイルを開きます」.

APIレベル7以下を使用している場合は、 getExternalStorageDirectory()を使用して、外部ストレージのルートを表すファイルを開きます」.

解凍コードには行が含まれていString path = context.getFilesDir().getPath()ます。上記のように変更してみてください。

于 2012-06-28T16:31:04.013 に答える