Android 通過WebView來播放flash線上視訊流
阿新 • • 發佈:2019-01-04
首先,Android 自帶的WebView控制元件是不支援flash播放的,在Android4.0以上的版本中,所以需要客戶端安裝adobe flashplayer播放器外掛,這樣就可以利用WebView來播放flash視訊。
具體的方法,還是直接上程式碼:
private FrameLayout mFullscreenContainer; private FrameLayout mContentView; private View mCustomView = null; private WebView mWebView; private String url = ""; private LinearLayout vLoading; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.webview_layout); initViews(); // 檢測本機是否安裝了flash播放器 if (ToolUtil.checkAPP(getApplicationContext(), "com.adobe.flashplayer")) { initWebView(); mHandler.sendEmptyMessageDelayed(011, 1000); } else { ToolUtil.MsgBox(VideoWebActivity.this, "提示", "請安裝flashplayer播放器。", "確認", "取消", new OKCallback() { @Override public void exec() { try { Intent intent = new Intent(Intent.ACTION_VIEW); // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 安裝檔案apk路徑 String fileName = Environment .getExternalStorageDirectory() + "/myapk/AdobeFlashPlayer.apk"; // 建立URI Uri uri = Uri.fromFile(new File(fileName)); intent.setDataAndType(uri, "application/vnd.android.package-archive"); VideoWebActivity.this.startActivityForResult( intent, 11); } catch (Exception e) { Log.e("VideoWebActivity", e.toString()); } } }, new CancelCallback() { @Override public void cancel() { } }); } if (getPhoneAndroidSDK() >= 14) {// 4.0 需開啟硬體加速 getWindow().setFlags(0x1000000, 0x1000000); } } private void initViews() { mFullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content); mContentView = (FrameLayout) findViewById(R.id.main_content); mWebView = (WebView) findViewById(R.id.webview_player); vLoading = (LinearLayout) findViewById(R.id.loading); vLoading.setVisibility(View.VISIBLE); url = getIntent().getStringExtra("Url"); Log.e("Play URL --", "---" + url + "-----"); } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (mWebView != null) { mWebView.loadUrl(url); Log.e("Play URL --", "---loadData-----"); } } }; private void initWebView() { WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setPluginState(PluginState.ON); settings.setAllowFileAccess(true); settings.setLoadWithOverviewMode(true); settings.setDomStorageEnabled(true);// 設定DOM元素儲存 settings.setAppCacheEnabled(true); settings.setDefaultTextEncodingName("UTF-8"); settings.setUseWideViewPort(true);// 設定任意縮放 mWebView.setBackgroundColor(0); mWebView.setVisibility(View.VISIBLE); mWebView.setWebChromeClient(new MyWebChromeClient()); mWebView.setWebViewClient(new MyWebViewClient()); } class MyWebChromeClient extends WebChromeClient { private CustomViewCallback mCustomViewCallback; private int mOriginalOrientation = 1; @Override public void onShowCustomView(View view, CustomViewCallback callback) { onShowCustomView(view, mOriginalOrientation, callback); super.onShowCustomView(view, callback); } @SuppressLint("Override") public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) { if (mCustomView != null) { callback.onCustomViewHidden(); return; } if (getPhoneAndroidSDK() >= 14) { mFullscreenContainer.addView(view); mCustomView = view; mCustomViewCallback = callback; mOriginalOrientation = getRequestedOrientation(); mContentView.setVisibility(View.INVISIBLE); mFullscreenContainer.setVisibility(View.VISIBLE); mFullscreenContainer.bringToFront(); setRequestedOrientation(mOriginalOrientation); } } public void onHideCustomView() { mContentView.setVisibility(View.VISIBLE); if (mCustomView == null) { return; } mCustomView.setVisibility(View.GONE); mFullscreenContainer.removeView(mCustomView); mCustomView = null; mFullscreenContainer.setVisibility(View.GONE); try { mCustomViewCallback.onCustomViewHidden(); } catch (Exception e) { } setRequestedOrientation(mOriginalOrientation); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); initWebView(); mHandler.removeMessages(011); mHandler.sendEmptyMessageDelayed(011, 1000); } class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return super.shouldOverrideUrlLoading(view, url); } // 載入完成 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); vLoading.setVisibility(View.GONE); } // 開始載入 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); Log.e("VideoWebActivity", "errorCode:-----" + errorCode + " " + description); } } public static int getPhoneAndroidSDK() { int version = 0; try { version = Integer.valueOf(android.os.Build.VERSION.SDK); } catch (NumberFormatException e) { e.printStackTrace(); } return version; } @Override public void onPause() {// 繼承自Activity super.onPause(); if (mWebView != null) { mWebView.onPause(); } } @Override public void onResume() {// 繼承自Activity super.onResume(); if (mWebView != null) { mWebView.onResume(); } } @Override protected void onDestroy() { if (mWebView != null) { try { mWebView.clearView(); mWebView.clearCache(true); mWebView.destroy(); mWebView = null; } catch (Exception e) { System.out.println("後臺no kills"); } Log.e("ada", "-----------destroy---------"); } super.onDestroy(); } @Override public void onBackPressed() { finish(); super.onBackPressed(); } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { mWebView.loadData("", "text/html; charset=UTF-8", null); finish(); } return super.dispatchKeyEvent(event); }
ANDROID應用開發的時候可能會用到WEBVIEW這個元件,使用過程中可能會接觸到WEBVIEWCLIENT與WEBCHROMECLIENT,那麼這兩個類到底有什麼不同呢?
WebViewClient主要幫助WebView處理各種通知、請求事件的,比如:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
WebChromeClient主要輔助WebView處理Javascript的對話方塊、網站圖示、網站title、載入進度等比如
onCloseWindow(關閉WebView)
onCreateWindow()
onJsAlert (WebView上alert無效,需要定製WebChromeClient處理彈出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
看上去他們有很多不同,實際使用的話,如果你的WebView只是用來處理一些 html的頁面內容,只用WebViewClient就行了,如果需要更豐富的處理效果,比如JS、進度條等,就要用到WebChromeClient。