在 Android 上的 WebView 中播放本地视频

Posted

技术标签:

【中文标题】在 Android 上的 WebView 中播放本地视频【英文标题】:Playing local video in WebView on Android 【发布时间】:2012-12-21 02:52:27 【问题描述】:

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

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

【问题讨论】:

我认为应该是file:// 而不是file:///,请确认一下。 这个错误一般是因为你正在播放的文件的格式在Android上不支持。 developer.android.com/guide/appendix/media-formats.html 或者:权限问题?看看这是否有帮助:weston-fl.com/blog/?p=2988 @taymless 你可以尝试在你的 html 中使用 &lt;embed&gt; 而不是 &lt;video&gt; 吗? @taymless 你能告诉我你是怎么解决你的问题的。我也有同样的问题。我想显示存储在资产文件夹中的视频。请尽快回复 @swapniladsure 看看我发布并接受的答案。您必须启用对视频文件的文件访问。我将文件复制到外部存储,包括所有 HTML 资产。这一切都在下面解释...... 【参考方案1】:

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 是我的资产中保存所有文件和子文件夹的文件夹。

【讨论】:

嘿,谢谢。我只是想验证一下,在此示例中,您的资产位于 file:///android_asset/matrix 中? 是的,在我复制它们之前,这就是文件所在的路径。之后,来自getExternalFilesDir(null) 的路径将根据操作系统版本而有所不同。 我得到一个致命的执行:java.lang.OutOfMemoryError

以上是关于在 Android 上的 WebView 中播放本地视频的主要内容,如果未能解决你的问题,请参考以下文章

YouTube 视频在 WebView Android 中仅在屏幕旋转时播放音频

HTML5 视频未在 android webview 中播放

Android webview html5 视频自动播放在 android 4.0.3 上不起作用

Android WebView播放html5视频,退出全屏后为啥就是黑屏了

为啥 Youtube 视频没有在 webview android 中播放

不使用 Flash 在 WebView Android 中播放 RTMP