android - 在 Android 的 WebView 中播放本地视频

标签 android html video webview local

我正在构建一个带有 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>

在 Activity 中创建

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");

第一个视频有效,第二个无效。我为 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)

我不知道这里有什么问题。任何帮助将不胜感激。

最佳答案

Slartibartfasts 帮助我解决了这个问题。由于这只是评论,所以我必须自己发布。

本质上这是一个权限问题。 Here is the link he posted .建议使用 MODE_WORLD_READABLE 复制文件的方法已弃用,请使用下面链接中描述的方法并将文件保存在外部存储中

我不得不将文件复制到外部存储器,然后访问那里的视频文件。由于不同版本的android外部存储的路径不同,我复制了所有相关的HTML文件(包括所有的JS、图形和视频文件)。参见 copying files ,如果您有子文件夹,请向下滚动寻找答案。

以下是我的复制方法:

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");

matrix 是我 Assets 中包含所有文件和子文件夹的文件夹。

关于android - 在 Android 的 WebView 中播放本地视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14194890/

相关文章:

java - 是否有适用于 Android 的可靠 Art-Net 库(DMX over IP)?

android - 如何在不进入无线设置页面的情况下启用移动数据或 WiFi

php - 如何用 while 循环绘制并填充表格?

javascript - 恢复视频播放 JavaScript

Android Chrome 无法通过文件系统 API 播放或加载视频

java - 我如何获得适用于 Windows XP 的 Xuggler jar?

android - 等宽等高 View

android - 如何导入Action Bar Sherlock?机器人工作室

html - OG :image not working for React Web Portfolio

javascript - 将 CSS 转换为内联 CSS?