Android使用WebView實現(xiàn)全屏切換播放網(wǎng)頁視頻功能
首先寫布局文件activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/video_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
></FrameLayout>
<Button
android:id="@+id/video_landport"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="全屏不顯示該按扭,點擊切換橫屏"
android:gravity="center"
/>
<WebView
android:id="@+id/video_webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
原理:實現(xiàn)全屏的時候把webview里的視頻放到一個View(布局里的video_view控件)里面,然后把webview隱藏掉!這樣就實現(xiàn)了全屏播放的!
現(xiàn)在具體來看看怎么實現(xiàn)的:
先放代碼MainActivity.java:
public class MainActivity extends Activity {
private FrameLayout videoview;// 全屏?xí)r視頻加載view
private Button videolandport;
private WebView videowebview;
private Boolean islandport = true;//true表示此時是豎屏,false表示此時橫屏。
private View xCustomView;
private xWebChromeClient xwebchromeclient;
private String url = "http://look.appjx.cn/mobile_api.php?mod=news&id=12604";
private WebChromeClient.CustomViewCallback xCustomViewCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉應(yīng)用標(biāo)題
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
initwidget();
initListener();
videowebview.loadUrl(url);
}
private void initListener() {
// TODO Auto-generated method stub
videolandport.setOnClickListener(new Listener());
}
private void initwidget() {
// TODO Auto-generated method stub
videoview = (FrameLayout) findViewById(R.id.video_view);
videolandport = (Button) findViewById(R.id.video_landport);
videowebview = (WebView) findViewById(R.id.video_webview);
WebSettings ws = videowebview.getSettings();
/**
* setAllowFileAccess 啟用或禁止WebView訪問文件數(shù)據(jù) setBlockNetworkImage 是否顯示網(wǎng)絡(luò)圖像
* setBuiltInZoomControls 設(shè)置是否支持縮放 setCacheMode 設(shè)置緩沖的模式
* setDefaultFontSize 設(shè)置默認(rèn)的字體大小 setDefaultTextEncodingName 設(shè)置在解碼時使用的默認(rèn)編碼
* setFixedFontFamily 設(shè)置固定使用的字體 setJavaSciptEnabled 設(shè)置是否支持Javascript
* setLayoutAlgorithm 設(shè)置布局方式 setLightTouchEnabled 設(shè)置用鼠標(biāo)激活被選項
* setSupportZoom 設(shè)置是否支持變焦
* */
ws.setBuiltInZoomControls(true);// 隱藏縮放按鈕
ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版適應(yīng)屏幕
ws.setUseWideViewPort(true);// 可任意比例縮放
ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法設(shè)置webview推薦使用的窗口。setLoadWithOverviewMode方法是設(shè)置webview加載的頁面的模式。
ws.setSavePassword(true);
ws.setSaveFormData(true);// 保存表單數(shù)據(jù)
ws.setJavaScriptEnabled(true);
ws.setGeolocationEnabled(true);// 啟用地理定位
ws.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");// 設(shè)置定位的數(shù)據(jù)庫路徑
ws.setDomStorageEnabled(true);
xwebchromeclient = new xWebChromeClient();
videowebview.setWebChromeClient(xwebchromeclient);
videowebview.setWebViewClient(new xWebViewClientent());
}
class Listener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.video_landport:
if (islandport) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
videolandport.setText("全屏不顯示該按扭,點擊切換橫屏");
}else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
videolandport.setText("全屏不顯示該按扭,點擊切換豎屏");
}
break;
default:
break;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (inCustomView()) {
hideCustomView();
return true;
}else {
videowebview.loadUrl("about:blank");
// mTestWebView.loadData("", "text/html; charset=UTF-8", null);
MainActivity.this.finish();
Log.i("testwebview", "===>>>2");
}
}
return true;
}
/**
* 判斷是否是全屏
* @return
*/
public boolean inCustomView() {
return (xCustomView != null);
}
/**
* 全屏?xí)r按返加鍵執(zhí)行退出全屏方法
*/
public void hideCustomView() {
xwebchromeclient.onHideCustomView();
}
/**
* 處理Javascript的對話框、網(wǎng)站圖標(biāo)、網(wǎng)站標(biāo)題以及網(wǎng)頁加載進度等
* @author
*/
public class xWebChromeClient extends WebChromeClient {
private Bitmap xdefaltvideo;
private View xprogressvideo;
@Override
//播放網(wǎng)絡(luò)視頻時全屏?xí)徽{(diào)用的方法
public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
{
if (islandport) {
}
else{
// ii = "1";
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
videowebview.setVisibility(View.GONE);
//如果一個視圖已經(jīng)存在,那么立刻終止并新建一個
if (xCustomView != null) {
callback.onCustomViewHidden();
return;
}
videoview.addView(view);
xCustomView = view;
xCustomViewCallback = callback;
videoview.setVisibility(View.VISIBLE);
}
@Override
//視頻播放退出全屏?xí)徽{(diào)用的
public void onHideCustomView() {
if (xCustomView == null)//不是全屏播放狀態(tài)
return;
// Hide the custom view.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
xCustomView.setVisibility(View.GONE);
// Remove the custom view from its container.
videoview.removeView(xCustomView);
xCustomView = null;
videoview.setVisibility(View.GONE);
xCustomViewCallback.onCustomViewHidden();
videowebview.setVisibility(View.VISIBLE);
//Log.i(LOGTAG, "set it to webVew");
}
//視頻加載添加默認(rèn)圖標(biāo)
@Override
public Bitmap getDefaultVideoPoster() {
//Log.i(LOGTAG, "here in on getDefaultVideoPoster");
if (xdefaltvideo == null) {
xdefaltvideo = BitmapFactory.decodeResource(
getResources(), R.drawable.videoicon);
}
return xdefaltvideo;
}
//視頻加載時進程loading
@Override
public View getVideoLoadingProgressView() {
//Log.i(LOGTAG, "here in on getVideoLoadingPregressView");
if (xprogressvideo == null) {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);
}
return xprogressvideo;
}
//網(wǎng)頁標(biāo)題
@Override
public void onReceivedTitle(WebView view, String title) {
(MainActivity.this).setTitle(title);
}
// @Override
// //當(dāng)WebView進度改變時更新窗口進度
// public void onProgressChanged(WebView view, int newProgress) {
// (MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
// }
}
/**
* 處理各種通知、請求等事件
* @author
*/
public class xWebViewClientent extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("webviewtest", "shouldOverrideUrlLoading: "+url);
return false;
}
}
/**
* 當(dāng)橫豎屏切換時會調(diào)用該方法
* @author
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.i("testwebview", "=====<<< onConfigurationChanged >>>=====");
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
Log.i("webview", " 現(xiàn)在是橫屏1");
islandport = false;
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Log.i("webview", " 現(xiàn)在是豎屏1");
islandport = true;
}
}
}
最后說下AndroidManifest.xml設(shè)置;
訪問網(wǎng)絡(luò)權(quán)限加上這句
<uses-permission android:name="android.permission.INTERNET"/>
當(dāng)切換橫豎屏?xí)r為了不重新調(diào)用onCreate等方法,要加個這句:
android:configChanges="orientation|keyboardHidden|screenSize"
總結(jié)
以上所述是小編給大家介紹的Android使用WebView實現(xiàn)全屏切換播放網(wǎng)頁視頻功能,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
Android 架構(gòu)之?dāng)?shù)據(jù)庫框架搭建
這篇文章主要給大家介紹的是Android 架構(gòu)之?dāng)?shù)據(jù)庫框架搭建,在本篇中,將會讓你一點一滴從無到有創(chuàng)建一個不再為數(shù)據(jù)庫而煩惱的框架。需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
Android WebView的使用方法及與JS 相互調(diào)用
這篇文章主要介紹了Android WebView的使用方法及與JS 相互調(diào)用的相關(guān)資料,WebView 是 Android 中一個非常實用的組​件, WebView 可以使得網(wǎng)頁輕松的內(nèi)嵌到app里,還可以直接跟js相互調(diào)用,需要的朋友可以參考下2017-07-07
Android字體大小自適應(yīng)不同分辨率的解決辦法
這篇文章主要介紹了Android字體大小自適應(yīng)不同分辨率的解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06
android截圖事件監(jiān)聽的原理與實現(xiàn)
本篇文章主要介紹了android截圖事件監(jiān)聽的原理與實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
android studio更新gradle錯誤構(gòu)建項目失敗的解決方法
這篇文章主要介紹了android studio更新gradle錯誤構(gòu)建項目失敗的解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Android ListView自動顯示隱藏布局的實現(xiàn)方法
這篇文章主要介紹了Android ListView自動顯示隱藏布局的實現(xiàn)方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
Flutter路由的跳轉(zhuǎn)、動畫和傳參詳解(最簡單)
這篇文章主要給大家介紹了關(guān)于Flutter路由的跳轉(zhuǎn)、動畫和傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01

