【问题标题】:Playing mp4 video in webview using html5 in android在android中使用html5在webview中播放mp4视频
【发布时间】:2013-05-29 12:06:20
【问题描述】:

我正在尝试在 webView 中使用 HTML5 在 android 中播放 mp4 视频,但不幸的是它不起作用,所以任何人都可以帮助我,我该怎么做?

这是我的代码 HTML 文件名为 new2.html

<video width="365" height="200" src="/sdcard/Download/video.mp4" controls autobuffer></video>


<!--<!DOCTYPE html>
<html>
<body>

<video width="320" height="240" controls autoplay>
  <source src="/sdcard/Download/video.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>

</body>
</html>-->

Java文件是:

public class WebActivity extends Activity {
     WebView wv;  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
         setContentView(R.layout.web_activity);  

         wv = (WebView) findViewById(R.id.webview);  
         wv.loadUrl("file:///android_asset/new2.html");
         wv.getSettings().setAllowFileAccess(true);
         wv.getSettings().setJavaScriptEnabled(true);
         wv.getSettings().setPluginsEnabled(true);
        // webview.loadUrl("file:///android_asset/new.html");
    }

}

XML 文件是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <WebView
        android:id="@+id/webview" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</LinearLayout>

【问题讨论】:

  • 我注意到的第一件事是视频标签引用了一个本地文件(在 /sdcard 上)。我想知道这是否允许(即使您正在通过本机应用程序调用 Web 视图)。如果用本地服务器上的 URL 替换该本地文件,视频会播放吗?如果是这样,那么这就是您有权限/访问问题的线索。
  • 你说“不工作”。你能详细说明吗?您是否启用了硬件加速(参见gist.github.com/3718414 示例)
  • @Offbeatmammal 我也试过了,但它不起作用意味着我得到一个 365*200 的屏幕以及视频视图的播放暂停、搜索、全屏等控件,但屏幕是空的。我试过 .mp4 和 swf 都没有播放。
  • @Multimedia Mike 这不是我的要求,我想使用 html 从本地 sd 卡播放视频。

标签: html video android-webview


【解决方案1】:

你需要通过本地主机调用你的文件——file://localhost/——否则你的手机将无法识别是你在请求权限。通过在没有本地主机的情况下使用浏览器,您正在 ping 卫星,并且无法重新进入。

您正在显示控件,因为它们来自公共 html 文件夹,但您的源(视频)没有。

【讨论】:

    【解决方案2】:

    来自this blog 声明有两个步骤:

    1. 创建扩展 ContentProvider 的新类并基本上覆盖 1 个方法 openFile。方法 onCreate 可以为空,返回 true,其余的可以抛出 UnsupportedOperationException。
    2. 向 AndroidManifest.xml 添加提供程序条目。

    This page shows 也可以这样做 - 该页面的摘要如下:

    第 1 步:在 AndroidManifest.xml 中声明您的 Content Provider:

    <provider android:name="MyDataContentProvider"
        android:authorities="com.techjini" />
                             ^^^^^^^^^^^ change this
    

    第 2 步:

    创建您的ContentProvider 并实施openFile。 您所要做的就是从 uri 中获取真实路径,打开它并返回描述符

    URI uri = URI.create("file:///data/data/com.techjini/files/myImage.jpeg");
                                  ^^^^^your path to your file    
    File file = new File(uri);
    ParcelFileDescriptor parcel =
        ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
    return parcel;
    

    您可以使用以下方法查找图像的存储位置:

    System.out.println(getFilesDir().getAbsolutePath());
    

    您现在可以加载文件了:

    myWebView.loadUrl("content://com.techjini/myImage.jpeg");
                                 ^^^^^^^^^^^change to same as in manifest
    

    希望有帮助。

    【讨论】:

      【解决方案3】:

      如果将“/sdcard/Download/video.mp4”更改为“file:///sdcard/Download/video.mp4”会怎样?我的意思是html部分:

      <video width="365" height="200" src="file:///sdcard/Download/video.mp4" controls autobuffer></video>
      

      我无法在自定义 Web 应用程序中打开 html 页面。但是我注意到,如果不添加“file:///”,视频将无法在我的 Android 浏览器中播放。 (在我的情况下,通过添加“file:///”,视频开始加载需要一些时间。)

      【讨论】:

        【解决方案4】:
        <video width="365" height="200" src="video.mp4" controls autobuffer></video>
        

        并且 video.mp4 应该在您的资产文件夹中,与您放置 new2.html 的位置相同

        【讨论】:

          【解决方案5】:

          要在WebView中播放MP4视频,需要先在Manifest中声明Content Provider

          <provider android:name = "MyDataContentProvider" android:authorities="com.myapp" />
          

          open()方法实现打开文件-

          URI myURL = URI.create("file:///mypath/new.mp4");
          File f = new File(myURL);
          ParcelFileDescriptor p =
             ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
          return p;
          

          【讨论】:

            猜你喜欢
            • 2021-05-30
            • 1970-01-01
            • 1970-01-01
            • 2013-03-24
            • 1970-01-01
            • 1970-01-01
            • 2017-06-15
            • 2013-04-14
            • 1970-01-01
            相关资源
            最近更新 更多