7

私は、WebViewローカルに保存されているビデオを再生することになっているアプリを作成しています。奇妙なことに、ビデオ プレーヤーがローカルのビデオ ファイルを処理していません。ただし、サーバーに保存されたビデオを再生します。

ローカル ファイル (html およびビデオ) はフォルダーに保存されます。assets/html_test

ここにファイルがあります。

HTML

<div class="video-container">
  <p>Server</p>
  <video poster="video/star.png" controls>
    <source src="http://broken-links.com/tests/media/BigBuck.m4v" />
  </video>
</div>

<div class="video-container">
  <p>local</p>
  <video poster="video/star.png" controls>
    <source src="BigBuck.m4v" />
  </video>
</div>

onCreate in アクティビティ

WebView browser = (WebView) findViewById(R.id.browser);

WebSettings webSettings = browser.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
webSettings.setAllowFileAccessFromFileURLs(true);

browser.setWebChromeClient(new WebChromeClient());

browser.loadUrl("file:///android_asset/html_test/video.html");

最初のビデオは機能しますが、2 番目のビデオは機能しません。にさまざまな値を試しましたがsource、どちらもうまくいきませんでした:

<source src="BigBuck.m4v" />
<source src="file:///android_asset/html_test/BigBuck.m4v" />

これが関連しているかどうかはわかりませんが、再生を押すとすぐにlogcatこれが出てきます:

01-07 12:19:18.073: E/MediaPlayer(32542): error (1, -2147483648)
01-07 12:19:18.073: E/MediaPlayer(32542): Error (1,-2147483648)

ここで何が問題なのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

4

Slartibartfasts は、これを解決するのに役立ちました。単なるコメントなので、自分で投稿する必要があります。

本質的には、許可の問題です。これが彼が投稿したリンクです。MODE_WORLD_READABLE以下のリンクで説明されている方法を使用して、ファイルを外部ストレージに保存してください。

ファイルを外部ストレージにコピーし、そこにあるビデオ ファイルにアクセスする必要がありました。Android のいくつかのバージョンでは外部ストレージへのパスが異なるため、関連するすべての HTML ファイル (すべての JS、グラフィック、およびビデオ ファイルを含む) をコピーしました。サブフォルダーがある場合は、ファイルのコピーを参照し、下にスクロールして答えを見つけてください。

ここに私のコピー方法があります:

private void copyAssets(String path)
{
    String[] files = null;

    try
    {
        files = getAssets().list(path);
    } catch (IOException e)
    {
        e.printStackTrace();
    }

    if (files.length == 0)
        copyFile(path);
    else
    {
        File dir = new File(getExternalFilesDir(null), path);

        if (!dir.exists())
            dir.mkdir();

        for (int i = 0; i < files.length; i++)
        {
            copyAssets(path + "/" + files[i]);
        }
    }
}

private void copyFile(String filename)
{
    InputStream in = null;

    File file;
    OutputStream out = null;

    try
    {
        in = getAssets().open(filename);
    } catch (IOException e)
    {
        Log.e(TAG, "ERROR WITH in = getAssets().open: " + filename);
        e.printStackTrace();
    }

    file = new File(getExternalFilesDir(null), filename);

    try
    {
        out = new FileOutputStream(file);
    } catch (FileNotFoundException e)
    {
        Log.e(TAG, "ERROR WITH out = new FileOutputStream(file);");
        e.printStackTrace();
    }

    byte[] data;

    try
    {
        data = new byte[in.available()];

        in.read(data);
        out.write(data);

        in.close();
        out.close();
    } catch (IOException e1)
    {
        e1.printStackTrace();
    }
}

私のonCreate中で私は呼ぶ

copyAssets("matrix");

マトリックスは、すべてのファイルとサブフォルダーを保持するアセット内のフォルダーです。

于 2013-01-11T10:18:35.673 に答える