Android用Webview播放视频问题

来源:互联网 发布:恐怖恶搞软件 编辑:程序博客网 时间:2024/06/05 17:44

注意,请保证你的手机已经下载 并安装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 plaincopy在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 plaincopy在CODE上查看代码片派生到我的代码片
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  

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

[java] view plaincopy在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 plaincopy在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 plaincopy在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 plaincopy在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 0
原创粉丝点击