Android用Webview播放视频问题

注意,请保证你的手机已经下载 并安装adobe flash player 

(http://blog.csdn.net/zircon_1973/article/details/8067041 Android WebView播放flash(判断是否安装flash插件 ))

原文:http://blog.csdn.net/lllkey/article/details/18453179

参考demo: http://download.csdn.net/download/mantianku/4831860

在播放优酷视频, 点击全屏的时候, 会黑屏, 而不显示需要全屏的view 

试过各种方法, 发现有一些细节需要注意:

1. demo的Manifest Activity需要设置为: 全屏, 横屏

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <activity android:name="com.demo.flashplay.ActFlashPlay"  
  2.             android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"  
  3.             android:screenOrientation="landscape" />  
注意: 此处如果不设置为 横屏 点击全屏也会失败的

有的说播放flash是需要在Activity添加硬件加速的属性, 这个demo是在程序判断, 所以没有添加


2. 添加权限:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  

3. 退出视频播放会出现视频还没停止的问题:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public void onPause() {// 继承自Activity  
  3.     super.onPause();  
  4.     mWebView.onPause();  
  5. }  
  6.   
  7. @Override  
  8. public void onResume() {// 继承自Activity  
  9.     super.onResume();  
  10.     mWebView.onResume();  
  11. }  
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  3.     if (keyCode == KeyEvent.KEYCODE_BACK  
  4.             && event.getAction() == KeyEvent.ACTION_DOWN) {  
  5.         mWebView.loadData("""text/html; charset=UTF-8"null);  
  6.         finish();  
  7.         return true;  
  8.     }  
  9.     return super.onKeyDown(keyCode, event);  
  10. }  

当按下返回时, 设置Webview加载空





代码:

xml文件: act_flashplay.xml

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
  2.        android:layout_width="match_parent"    
  3.        android:layout_height="match_parent">  
  4.     
  5.    <FrameLayout    
  6.        android:id="@+id/fullscreen_custom_content"    
  7.        android:layout_width="match_parent"    
  8.        android:layout_height="match_parent"    
  9.        android:visibility="gone" />    
  10.     
  11.    <FrameLayout    
  12.        android:id="@+id/main_content"    
  13.        android:layout_width="match_parent"    
  14.        android:layout_height="match_parent">    
  15.     
  16.        <WebView    
  17.            android:id="@+id/webview_player"    
  18.            android:layout_width="match_parent"    
  19.            android:layout_height="match_parent"    
  20.            android:scrollbars="none" />    
  21.     </FrameLayout >   
  22. </FrameLayout>   

java文件: ActFlashPlay.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.webkit.WebChromeClient;  
  5. import android.webkit.WebSettings;  
  6. import android.webkit.WebSettings.PluginState;  
  7. import android.webkit.WebView;  
  8. import android.webkit.WebViewClient;  
  9. import android.widget.FrameLayout;  
  10.   
  11. import com.example.myalldemo.R;  
  12.   
  13. public class ActFlashPlay extends Activity {  
  14.   
  15.     private FrameLayout mFullscreenContainer;  
  16.     private FrameLayout mContentView;  
  17.     private View mCustomView = null;  
  18.     private WebView mWebView;  
  19.     private String s = "<html><head><meta charset=\"utf-8\" /><title>swf</title></head><body>"  
  20.             + "<embed src=\"http://player.youku.com/player.php/sid/XMzcyMzY2NTY4/v.swf\"  bgcolor=\"#000000\""  
  21.             + "  width=\"80%\" height=\"80%\" align=\"middle\" allowScriptAccess=\"always\""  
  22.             + " allowFullScreen=\"true\" wmode=\"transparent\" "  
  23.             + "type=\"application/x-shockwave-flash\"> </embed></body></html>";  
  24.   
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.act_flashplay);  
  29.   
  30.         initViews();  
  31.         initWebView();  
  32.   
  33.         if (getPhoneAndroidSDK() >= 14) {// 4.0 需打开硬件加速  
  34.             getWindow().setFlags(0x10000000x1000000);  
  35.         }  
  36.   
  37.         mWebView.loadData(s, "text/html; charset=UTF-8"null);  
  38. //      mWebView.loadUrl("file:///android_asset/1234.html");  
  39.     }  
  40.   
  41.     private void initViews() {  
  42.         mFullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);  
  43.         mContentView = (FrameLayout) findViewById(R.id.main_content);  
  44.         mWebView = (WebView) findViewById(R.id.webview_player);  
  45.   
  46.     }  
  47.   
  48.     private void initWebView() {  
  49.         WebSettings settings = mWebView.getSettings();  
  50.         settings.setJavaScriptEnabled(true);  
  51.         settings.setJavaScriptCanOpenWindowsAutomatically(true);  
  52.         settings.setPluginState(PluginState.ON);  
  53.         // settings.setPluginsEnabled(true);  
  54.         settings.setAllowFileAccess(true);  
  55.         settings.setLoadWithOverviewMode(true);  
  56.   
  57.         mWebView.setWebChromeClient(new MyWebChromeClient());  
  58.         mWebView.setWebViewClient(new MyWebViewClient());  
  59.     }  
  60.   
  61.     class MyWebChromeClient extends WebChromeClient {  
  62.   
  63.         private CustomViewCallback mCustomViewCallback;  
  64.         private int mOriginalOrientation = 1;  
  65.   
  66.         @Override  
  67.         public void onShowCustomView(View view, CustomViewCallback callback) {  
  68.             // TODO Auto-generated method stub  
  69.             onShowCustomView(view, mOriginalOrientation, callback);  
  70.             super.onShowCustomView(view, callback);  
  71.   
  72.         }  
  73.   
  74.         public void onShowCustomView(View view, int requestedOrientation,  
  75.                 WebChromeClient.CustomViewCallback callback) {  
  76.             if (mCustomView != null) {  
  77.                 callback.onCustomViewHidden();  
  78.                 return;  
  79.             }  
  80.             if (getPhoneAndroidSDK() >= 14) {  
  81.                 mFullscreenContainer.addView(view);  
  82.                 mCustomView = view;  
  83.                 mCustomViewCallback = callback;  
  84.                 mOriginalOrientation = getRequestedOrientation();  
  85.                 mContentView.setVisibility(View.INVISIBLE);  
  86.                 mFullscreenContainer.setVisibility(View.VISIBLE);  
  87.                 mFullscreenContainer.bringToFront();  
  88.   
  89.                 setRequestedOrientation(mOriginalOrientation);  
  90.             }  
  91.   
  92.         }  
  93.   
  94.         public void onHideCustomView() {  
  95.             mContentView.setVisibility(View.VISIBLE);  
  96.             if (mCustomView == null) {  
  97.                 return;  
  98.             }  
  99.             mCustomView.setVisibility(View.GONE);  
  100.             mFullscreenContainer.removeView(mCustomView);  
  101.             mCustomView = null;  
  102.             mFullscreenContainer.setVisibility(View.GONE);  
  103.             try {  
  104.                 mCustomViewCallback.onCustomViewHidden();  
  105.             } catch (Exception e) {  
  106.             }  
  107.             // Show the content view.  
  108.   
  109.             setRequestedOrientation(mOriginalOrientation);  
  110.         }  
  111.   
  112.     }  
  113.   
  114.     class MyWebViewClient extends WebViewClient {  
  115.   
  116.         @Override  
  117.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  118.             // TODO Auto-generated method stub  
  119.             view.loadUrl(url);  
  120.             return super.shouldOverrideUrlLoading(view, url);  
  121.         }  
  122.   
  123.     }  
  124.   
  125.     public static int getPhoneAndroidSDK() {  
  126.         // TODO Auto-generated method stub  
  127.         int version = 0;  
  128.         try {  
  129.             version = Integer.valueOf(android.os.Build.VERSION.SDK);  
  130.         } catch (NumberFormatException e) {  
  131.             e.printStackTrace();  
  132.         }  
  133.         return version;  
  134.   
  135.     }  
  136.   
  137.     @Override  
  138.     public void onPause() {// 继承自Activity  
  139.         super.onPause();  
  140.         mWebView.onPause();  
  141.     }  
  142.   
  143.     @Override  
  144.     public void onResume() {// 继承自Activity  
  145.         super.onResume();  
  146.         mWebView.onResume();  
  147.     }  
  148. }  

注: demo中的方法是loadUrl, load的是asset文件夹下的1234.html, 可以播放视频, 同样的,上面代码中用loadData也是可以的

大家可以试一试, 有什么问题可以一起讨论



附:http://www.eoeandroid.com/thread-185654-1-1.html

本帖最后由 wangwenxin6868 于 2012-7-19 16:11 编辑

在使用webView.loadData(data, "text/html", "utf-8"),出现找不到网页的问题,
检查之后发现data数据是正确的,也有上网的权限,可是就是找不到网页,
后经过查找,找到了解决方法:把 webView.loadData 改为 webView.loadDataWithBaseURL 方法就可以了,
可以这样使用:webView.loadDataWithBaseURL(null,data, "text/html",  "utf-8", null); 

原因如下:
    loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,
      显示找不到网页还有部分html代码。因为css中经常用'#', '%'等字符,所以大部分网页会出现解析错误,需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f 。
      webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html",  "utf-8");
这样写之后会发现错误没有了,但是显示效果不好,一些背景颜色排版效果都没有了。
public void  loadDataWithBaseURL  ([url=]String[/url] baseUrl, [url=]String[/url] data, [url=]String[/url] mimeType, [url=]String[/url] encoding, [url=]String[/url] historyUrl)


推荐使用loadDataWithBaseURL(),只是多了两个参数,我们可以这样使用
webView.loadDataWithBaseURL(null,data, "text/html",  "utf-8", null);
这样html代码就会完美解析了。
注意,访问网络要在配置文件中加上权限


webView.getSettings().setJavaScriptEnabled(true);  
让WebView 支持JavaScript。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中的 WebView 播放视频是通过 VideoView 实现的,在 WebView播放视频需要以下几个步骤: 1. 配置 WebView 的 settings: ``` webView.settings.javaScriptEnabled = true webView.settings.pluginState = WebSettings.PluginState.ON webView.settings.allowFileAccess = true ``` 2. 在 WebViewClient 的 shouldOverrideUrlLoading 方法中处理视频链接: ``` override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) { view?.loadUrl(url) return false } else { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(intent) return true } } ``` 3. 在 WebChromeClient 中实现视频播放: ``` webView.webChromeClient = object : WebChromeClient() { override fun onShowCustomView(view: View?, callback: CustomViewCallback?) { super.onShowCustomView(view, callback) if (view is FrameLayout) { videoView = VideoView(this@MainActivity) videoView?.layoutParams = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) view.addView(videoView) setContentView(view) videoView?.setVideoPath(videoUrl) videoView?.setOnPreparedListener { videoView?.start() } } } override fun onHideCustomView() { super.onHideCustomView() if (videoView != null) { videoView?.stopPlayback() videoView = null } setContentView(webView) } } ``` 其中,onShowCustomView 方法会在 WebView播放视频时调用,onHideCustomView 方法会在视频播放结束后调用。 需要注意的是,Android 7.0 以上需要在 AndroidManifest.xml 文件中添加以下代码来允许应用播放 HTTP 和 HTTPS 视频: ``` <application ... android:usesCleartextTraffic="true"> ... </application> ``` 以上就是 Android WebView 播放视频的全拼了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值