1.首先導入騰訊官方包 tbs_sdk_thirdapp_v2.5.0.1031_36880_sharewithdownload_obfs_20161107_154437.jar,最新的可以自行下載,地址http://x5.tencent.com/
2.自定義webview控件重寫,ScrollWebView.java(騰訊X5)ScrollWebViewNative.java(安卓原生),下面直接貼代碼
ScrollWebView.java
package view; import android.content.Context; import android.util.AttributeSet; import java.util.Map; /** * webview控件重寫,解決setOnScrollChangeListener在api<23的時候不兼容問題 * Created by TZG on 2016/11/17. */ public class ScrollWebView extends com.tencent.smtt.sdk.WebView{ public interface ScrollViewListener { void onScrollChanged(com.tencent.smtt.sdk.WebView scrollWebView, int x, int y, int oldx, int oldy); } private ScrollViewListener scrollViewListener = null; public ScrollWebView(Context context) { super(context); } public ScrollWebView(Context context, AttributeSet attributeSet) { super(context, attributeSet); } public ScrollWebView(Context context, AttributeSet attributeSet, int i) { super(context, attributeSet, i); } public ScrollWebView(Context context, AttributeSet attributeSet, int i, boolean b) { super(context, attributeSet, i, b); } public ScrollWebView(Context context, AttributeSet attributeSet, int i, Map<String, Object> map, boolean b) { super(context, attributeSet, i, map, b); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } }
ScrollWebViewNative.java
package view; import android.content.Context; import android.util.AttributeSet; import android.webkit.WebView; /** * webview控件重寫,解決setOnScrollChangeListener在api<23的時候不兼容問題 * Created by TZG on 2016/11/18. */ public class ScrollWebViewNative extends WebView { public ScrollWebViewNative(Context context) { super(context); } public ScrollWebViewNative(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollWebViewNative(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public interface ScrollViewListener { void onScrollChanged(WebView ScrollWebViewNative, int x, int y, int oldx, int oldy); } private ScrollViewListener scrollViewListener = null; public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } }
3.Activity活動封裝,WebCoreActivity.java(騰訊X5),WebCoreNativeActivity.java(安卓原生),WebCoreJsInterface.java(JS通信類)
WebCoreActivity.java
package web; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; import com.dykj.hongchunshu.R; import com.tencent.smtt.export.external.interfaces.JsResult; import com.tencent.smtt.export.external.interfaces.WebResourceRequest; import com.tencent.smtt.export.external.interfaces.WebResourceResponse; import com.tencent.smtt.sdk.QbSdk; import com.tencent.smtt.sdk.WebChromeClient; import com.tencent.smtt.sdk.WebSettings; import com.tencent.smtt.sdk.WebView; import com.tencent.smtt.sdk.WebViewClient; import butterknife.Bind; import butterknife.ButterKnife; import data.DataManager; import tool.PUB; import view.ScrollWebView; /** * webview 基於騰訊X5內核 * Created by TZG on 2016/11/17. */ public class WebCoreActivity extends AppCompatActivity { @Bind(R.id.sr_refresh) android.support.v4.widget.SwipeRefreshLayout srRefresh; private view.ScrollWebView tbsContent; // private ProgressBar mPageLoadingProgressBar; private ProgressDialog mProgressDialog; private String InUrl = "http://m.baidu.com/"; private String mTitle = ""; private static final int MAX_LENGTH = 10; private Boolean ReturnAll = false;//多級返回支持 private ImageView img_left; private TextView tv_title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams. SOFT_INPUT_STATE_HIDDEN); setContentView(R.layout.activity_webcore); ButterKnife.bind(this); runOnUiThread(new Runnable() { @Override public void run() { /* * QbSdk */ QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { @Override public void onViewInitFinished(boolean arg0) { // TODO Auto-generated method stub Log.e("apptbs", " onViewInitFinished is " + arg0); } @Override public void onCoreInitFinished() { // TODO Auto-generated method stub Log.i("apptbs", " onCoreInitFinished is OK"); } }; QbSdk.initX5Environment(getApplicationContext(), cb); } }); tv_title = (TextView) this.findViewById(R.id.tv_title); img_left = (ImageView) this.findViewById(R.id.img_left); tbsContent = (view.ScrollWebView) this.findViewById(R.id.forum_context); // mPageLoadingProgressBar = (ProgressBar) this.findViewById(R.id.progressBar1); img_left.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ReturnAll) { if (tbsContent.canGoBack()) { tbsContent.goBack();// 返回前一個頁面 } else { finish(); } } else { finish(); } } }); try { GetIntentData(); } catch (Exception e) { e.printStackTrace(); } initProgressBar(); initData(); //設置顏色,這裏只需要單色刷新 srRefresh.setColorSchemeResources( // android.R.color.holo_blue_bright, // android.R.color.holo_green_light, // android.R.color.holo_orange_light, // android.R.color.holo_red_light R.color.main ); srRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { tbsContent.clearCache(true); initData(); } }); /** * 該方法解決了,webview滑動式未到頂部進行刷新,存在的BUG,通過判斷是否存在頁面需要刷新 * 從而,解決刷新衝突 by tzg 20161117 */ srRefresh.setTag(true); tbsContent.setScrollViewListener(new ScrollWebView.ScrollViewListener() { @Override public void onScrollChanged(WebView scrollWebView, int x, int y, int oldx, int oldy) { PUB.tlog.d("y:" + y + "oldy:" + oldy); if (y == 0) {//滑動到頂部 if (Boolean.valueOf(srRefresh.getTag().toString()) == false) { srRefresh.setEnabled(true); srRefresh.setTag(true); } } else { if (Boolean.valueOf(srRefresh.getTag().toString()) == true) { srRefresh.setEnabled(false); srRefresh.setTag(false); } } } }); } /* * Intent方法接收 * */ private void GetIntentData() throws Exception { try { this.mTitle = getIntent().getStringExtra("title"); } catch (Exception ex) { PUB.tlog.e(ex); } try { this.InUrl = getIntent().getStringExtra("url"); } catch (Exception ex) { PUB.tlog.e(ex); } this.ReturnAll = getIntent().getBooleanExtra("returnall", false);//多級返回支持,默認不開啓,該參數可不傳遞 } private void initProgressBar() { // mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1); // mPageLoadingProgressBar.setMax(100); // mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar)); if (DataManager.version <= 19) { mProgressDialog = new ProgressDialog(this, AlertDialog.THEME_HOLO_LIGHT); } else { mProgressDialog = new ProgressDialog(this, android.R.style.Theme_DeviceDefault_Light_Panel); } // mProgressDialog.setMessage("Loading..."); mProgressDialog.setCanceledOnTouchOutside(false); mProgressDialog.setIndeterminate(true); // mProgressDialog.setCancelable(false); //mProgressDialog.show(); } private void initData() { tbsContent.loadUrl(InUrl); WebSettings webSettings = tbsContent.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 優先使用緩存,WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 不使用緩存,WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); tbsContent.addJavascriptInterface(new WebCoreJsInterface(this), "APP"); tbsContent.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Intent intent; // 判斷URL if (url.startsWith("http:") || url.startsWith("https:")) { view.loadUrl(url); } // 調用撥號程序 if (url.startsWith("tel:")) { intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } // 發送短信 if (url.startsWith("sms:")) { Uri uri = Uri.parse(url); intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra("sms_body", ""); startActivity(intent); } // 導航 if (url.startsWith("geo:")) { Uri uri = Uri.parse("geo:0,0?q=30.732993,120.756175,地址"); intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } // 返回 if (url.startsWith("go:")) { if (url.startsWith("go:back")) { if (tbsContent.canGoBack()) { tbsContent.stopLoading(); tbsContent.goBack(); } else {//go:finish finish(); } } } return true; } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { tbsContent.stopLoading(); tbsContent.clearView(); tbsContent.setVisibility(View.GONE); Log.e("error", "errorCode:" + errorCode + " description:" + description + " failingUrl:" + failingUrl); int Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert; int version = Build.VERSION.SDK_INT; if (version > 21) { Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert; } else { Theme = AlertDialog.THEME_DEVICE_DEFAULT_LIGHT; } AlertDialog.Builder builder = new AlertDialog.Builder(WebCoreActivity.this, Theme); builder.setTitle("溫馨提示"); String msg = "";//"檢測到狀態異常,請聯繫開發者"+description + "[" + errorCode + "]"; //if(errorCode==-2){ msg = "狀態異常,請聯繫管理員或檢查網絡後再重試!"; //} builder.setMessage(msg); builder.setCancelable(false); builder.setPositiveButton("關閉", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { WebCoreActivity.this.finish(); } }); builder.show(); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // TODO Auto-generated method stub Log.d("should", "request.getUrl().toString() is " + request.getUrl().toString()); return super.shouldInterceptRequest(view, request); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }); tbsContent.setWebChromeClient(new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { if (InUrl == null) { return; } else if (mTitle.equals("")) { // !tbsContent.getUrl().equalsIgnoreCase(url) && if (title != null && title.length() > MAX_LENGTH) tv_title.setText(title.subSequence(0, MAX_LENGTH) + "..."); else tv_title.setText(title); } else { tv_title.setText(mTitle); } } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { WebCoreJsInterface.Dialogshow(message); result.confirm(); return true; } @Override public void onProgressChanged(WebView view, int newProgress) { // TODO Auto-generated method stub // mPageLoadingProgressBar.setProgress(newProgress); // if (mPageLoadingProgressBar != null && newProgress != 100) { // mPageLoadingProgressBar.setVisibility(View.VISIBLE); if (mProgressDialog != null && newProgress != 100) { srRefresh.setRefreshing(false); mProgressDialog.setMessage(newProgress + "%"); mProgressDialog.show(); } else { mProgressDialog.dismiss();// 請求成功,關閉ProgressDialog } } }); } @Override public void onStart() { super.onStart(); } @Override public void onStop() { super.onStop(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (ReturnAll) { if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) { tbsContent.goBack();// 返回前一個頁面 return true; } } else { if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); return true; } } return super.onKeyDown(keyCode, event); } }
WebCoreNativeActivity.java
package web; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.RequiresApi; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.TextView; import com.dykj.hongchunshu.R; import butterknife.Bind; import butterknife.ButterKnife; import data.DataManager; import tool.PUB; import view.ScrollWebViewNative; /** * webview 基於安卓原生內核 * Created by TZG on 2016/11/18. */ public class WebCoreNativeActivity extends AppCompatActivity { @Bind(R.id.sr_refresh) SwipeRefreshLayout srRefresh; private ScrollWebViewNative tbsContent; // private ProgressBar mPageLoadingProgressBar; private ProgressDialog mProgressDialog; private String InUrl = "http://m.baidu.com/"; private String mTitle = ""; private static final int MAX_LENGTH = 10; private Boolean ReturnAll = false;//多級返回支持 private ImageView img_left; private TextView tv_title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams. SOFT_INPUT_STATE_HIDDEN); setContentView(R.layout.activity_webcore_native); ButterKnife.bind(this); tv_title = (TextView) this.findViewById(R.id.tv_title); img_left = (ImageView) this.findViewById(R.id.img_left); tbsContent = (ScrollWebViewNative) this.findViewById(R.id.forum_context); // mPageLoadingProgressBar = (ProgressBar) this.findViewById(R.id.progressBar1); img_left.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ReturnAll) { if (tbsContent.canGoBack()) { tbsContent.goBack();// 返回前一個頁面 } else { finish(); } } else { finish(); } } }); try { GetIntentData(); } catch (Exception e) { e.printStackTrace(); } initProgressBar(); initData(); //設置顏色,這裏只需要單色刷新 srRefresh.setColorSchemeResources( // android.R.color.holo_blue_bright, // android.R.color.holo_green_light, // android.R.color.holo_orange_light, // android.R.color.holo_red_light R.color.main ); srRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { tbsContent.clearCache(true); initData(); } }); /** * 該方法解決了,webview滑動式未到頂部進行刷新,存在的BUG,通過判斷是否存在頁面需要刷新 * 從而,解決刷新衝突 by tzg 20161117 */ srRefresh.setTag(true); tbsContent.setScrollViewListener(new ScrollWebViewNative.ScrollViewListener() { @Override public void onScrollChanged(android.webkit.WebView ScrollWebViewNative, int x, int y, int oldx, int oldy) { PUB.tlog.d("y:" + y + "oldy:" + oldy); if (y == 0) {//滑動到頂部 if (Boolean.valueOf(srRefresh.getTag().toString()) == false) { srRefresh.setEnabled(true); srRefresh.setTag(true); } } else { if (Boolean.valueOf(srRefresh.getTag().toString()) == true) { srRefresh.setEnabled(false); srRefresh.setTag(false); } } } }); } /* * Intent方法接收 * */ private void GetIntentData() throws Exception { try { this.mTitle = getIntent().getStringExtra("title"); } catch (Exception ex) { PUB.tlog.e(ex); } try { this.InUrl = getIntent().getStringExtra("url"); } catch (Exception ex) { PUB.tlog.e(ex); } this.ReturnAll = getIntent().getBooleanExtra("returnall", false);//多級返回支持,默認不開啓,該參數可不傳遞 } private void initProgressBar() { // mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1); // mPageLoadingProgressBar.setMax(100); // mPageLoadingProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar)); if (DataManager.version <= 19) { mProgressDialog = new ProgressDialog(this, AlertDialog.THEME_HOLO_LIGHT); } else { mProgressDialog = new ProgressDialog(this, android.R.style.Theme_DeviceDefault_Light_Panel); } // mProgressDialog.setMessage("Loading..."); mProgressDialog.setCanceledOnTouchOutside(false); mProgressDialog.setIndeterminate(true); // mProgressDialog.setCancelable(false); //mProgressDialog.show(); } private void initData() { tbsContent.loadUrl(InUrl); WebSettings webSettings = tbsContent.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 優先使用緩存,WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 不使用緩存,WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); tbsContent.addJavascriptInterface(new WebCoreJsInterface(this), "APP"); tbsContent.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Intent intent; // 判斷URL if (url.startsWith("http:") || url.startsWith("https:")) { view.loadUrl(url); } // 調用撥號程序 if (url.startsWith("tel:")) { intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } // 發送短信 if (url.startsWith("sms:")) { Uri uri = Uri.parse(url); intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra("sms_body", ""); startActivity(intent); } // 導航 if (url.startsWith("geo:")) { Uri uri = Uri.parse("geo:0,0?q=30.732993,120.756175,地址"); intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } // 返回 if (url.startsWith("go:")) { if (url.startsWith("go:back")) { if (tbsContent.canGoBack()) { tbsContent.stopLoading(); tbsContent.goBack(); } else {//go:finish finish(); } } } return true; } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { tbsContent.stopLoading(); tbsContent.clearView(); tbsContent.setVisibility(View.GONE); Log.e("error", "errorCode:" + errorCode + " description:" + description + " failingUrl:" + failingUrl); int Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert; int version = Build.VERSION.SDK_INT; if (version > 21) { Theme = android.R.style.Theme_DeviceDefault_Light_Dialog_Alert; } else { Theme = AlertDialog.THEME_DEVICE_DEFAULT_LIGHT; } AlertDialog.Builder builder = new AlertDialog.Builder(WebCoreNativeActivity.this, Theme); builder.setTitle("溫馨提示"); String msg = "";//"檢測到狀態異常,請聯繫開發者"+description + "[" + errorCode + "]"; //if(errorCode==-2){ msg = "狀態異常,請聯繫管理員或檢查網絡後再重試!"; //} builder.setMessage(msg); builder.setCancelable(false); builder.setPositiveButton("關閉", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { WebCoreNativeActivity.this.finish(); } }); builder.show(); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { // TODO Auto-generated method stub Log.d("should", "request.getUrl().toString() is " + request.getUrl().toString()); return super.shouldInterceptRequest(view, request); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }); tbsContent.setWebChromeClient(new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { if (InUrl == null) { return; } else if (mTitle.equals("")) { // !tbsContent.getUrl().equalsIgnoreCase(url) && if (title != null && title.length() > MAX_LENGTH) tv_title.setText(title.subSequence(0, MAX_LENGTH) + "..."); else tv_title.setText(title); } else { tv_title.setText(mTitle); } } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { WebCoreJsInterface.Dialogshow(message); result.confirm(); return true; } @Override public void onProgressChanged(WebView view, int newProgress) { // TODO Auto-generated method stub // mPageLoadingProgressBar.setProgress(newProgress); // if (mPageLoadingProgressBar != null && newProgress != 100) { // mPageLoadingProgressBar.setVisibility(View.VISIBLE); if (mProgressDialog != null && newProgress != 100) { srRefresh.setRefreshing(false); mProgressDialog.setMessage(newProgress + "%"); mProgressDialog.show(); } else { mProgressDialog.dismiss();// 請求成功,關閉ProgressDialog } } }); } @Override public void onStart() { super.onStart(); } @Override public void onStop() { super.onStop(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (ReturnAll) { if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) { tbsContent.goBack();// 返回前一個頁面 return true; } } else { if (keyCode == KeyEvent.KEYCODE_BACK) { finish(); return true; } } return super.onKeyDown(keyCode, event); } }
WebCoreJsInterface.java
package web; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.telephony.TelephonyManager; import android.webkit.JavascriptInterface; import android.widget.Toast; import com.dykj.hongchunshu.AlterPasswordActivity; import com.dykj.hongchunshu.LoginActivity; import com.dykj.hongchunshu.MainActivity; /** * 自定義的Android代碼和JavaScript代碼之間的橋樑類 * * @title WebAppInterface.java * @author tongzhenggang * @e-mail [email protected] */ public class WebCoreJsInterface { private String str; private String mAppInfoFilePath, sdk, version, model, DeviceId; private static Context mContext; public WebCoreJsInterface(Context c) { mContext = c; } // 如果target 大於等於API 17,則需要加上如下註解 // @JavascriptInterface @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show(); } /* * 關閉當前activity */ @JavascriptInterface public void finish(String toast) { ((Activity) mContext).finish(); Toast.makeText(mContext,toast,Toast.LENGTH_SHORT).show(); } /* * 關閉APP */ @JavascriptInterface public void Close() { new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT) .setTitle("溫馨提示") .setMessage("確定要退出麼?") .setCancelable(true) .setPositiveButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MainActivity.activity.finish(); ((Activity) mContext).finish(); mContext.startActivity(new Intent(mContext, LoginActivity.class));//登陸 } }) .setNegativeButton("取消",null) .show(); } @JavascriptInterface public String getDevice() { // 獲取設備信息 // sdk = android.os.Build.VERSION.SDK; // SDK號 // version = android.os.Build.VERSION.RELEASE; // android系統版本號 // model = android.os.Build.MODEL; // 手機型號 // model = model.replace(" ", "").toLowerCase();// 小寫轉換去空格 TelephonyManager manager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); DeviceId = manager.getDeviceId().trim();// 設備編號 str = DeviceId; return str; } /** * 客戶端展示對話框 * */ @JavascriptInterface public static void Dialogshow(String Msg) { new AlertDialog.Builder(mContext, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).setTitle("提示").setMessage(Msg) .setCancelable(true).setPositiveButton("朕知道了", null).show(); } /** * 播放音頻 */ @JavascriptInterface public static void Mp3play(String type, String url) { //調用系統播放器 if (type.equals("0")) { Intent it = new Intent(Intent.ACTION_VIEW); it.setDataAndType(Uri.parse(url), "audio/MP3"); ((Activity) mContext).startActivity(it); } //不調用播放器 else { MediaPlayer mediaPlayer = new MediaPlayer(); Uri uri = Uri.parse(url); mediaPlayer = MediaPlayer.create(mContext, uri); mediaPlayer.start(); } } /** * 再次打開WebCoreActivity * @param title * @param Url */ @JavascriptInterface public static void OpenWeb(String title, String Url) { // ToastUtil.show(mContext, "title:"+title+"Url:"+Url); //PUB.web(mContext, title, Url); } /** * 更改密碼原生界面 */ @JavascriptInterface public void AlterPasswordActivity(){ mContext.startActivity(new Intent(mContext, AlterPasswordActivity.class)); } }
4.webview訪問封裝
WebAction.java
package tool; import android.app.Activity; import android.content.Intent; import data.DataManager; import web.WebCoreActivity; import web.WebCoreNativeActivity; /** * webview方法封裝,如果安卓4.4 sdk>19 ,則執行騰訊X5,否則使用原生webview * Created by TZG on 2016/11/17. */ public class WebAction { private Intent in; /** * web 封裝訪問1,可自定義控制 * @param activity 活動 * @param title 標題,傳空則自動讀取頁面標題 * @param Url 網址 * @param returnAll 是否支持多級返回操作 */ public WebAction(Activity activity, String title, String Url, Boolean returnAll){ if (DataManager.version <= 19) { in = new Intent(activity, WebCoreNativeActivity.class); }else{ in = new Intent(activity, WebCoreActivity.class); } in.putExtra("title", title); in.putExtra("url", Url); in.putExtra("returnall", returnAll);//是否支持多級返回操作 activity.startActivity(in); } /** * web 封裝訪問2,不支持多級返回 * @param activity 活動 * @param title 標題,傳空則自動讀取頁面標題 * @param Url 網址 */ public WebAction(Activity activity,String title,String Url){ if (DataManager.version <= 19) { in = new Intent(activity, WebCoreNativeActivity.class); }else{ in = new Intent(activity, WebCoreActivity.class); } in.putExtra("title", title); in.putExtra("url", Url); in.putExtra("returnall", false);//不支持多級返回操作 activity.startActivity(in); } /** * web 封裝訪問3,不支持多級返回且標題自動獲取頁面標題 * @param activity 活動 * @param Url 網址 */ public WebAction(Activity activity,String Url){ if (DataManager.version <= 19) { in = new Intent(activity, WebCoreNativeActivity.class); }else{ in = new Intent(activity, WebCoreActivity.class); } in.putExtra("title", "");//傳空則自動讀取頁面標題 in.putExtra("url", Url); in.putExtra("returnall", false);//不支持多級返回操作 activity.startActivity(in); } }
5.訪問方法
3個方法調用。①支持自動title讀取,②自定義title及直接返回,@自定義title,自定義返回(支持多及頁面返回)。具體描述請參考4 的封裝類註釋說明
new WebAction(getActivity(), "http://baidu.com/");
new WebAction(getActivity(), "測試一下", "http://baidu.com/");
new WebAction(getActivity(), "測試一下", "http://baidu.com/",true);
6.XML佈局
activity_webcore.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="web.WebCoreActivity"> <RelativeLayout android:id="@+id/rl_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/main"> <ImageView android:id="@+id/img_left" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_centerVertical="true" android:paddingBottom="15dp" android:paddingLeft="5dp" android:paddingRight="10dp" android:paddingTop="15dp" android:src="@drawable/back_white" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:paddingBottom="10dp" android:paddingTop="10dp" android:text="@string/loading" android:textColor="@color/white" android:textSize="20sp" /> </RelativeLayout> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <view.ScrollWebView android:id="@+id/forum_context" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="@color/whitesmoke" android:scrollbars="none"> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="1dp" android:visibility="gone" /> <LinearLayout android:id="@+id/ll_loading" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:gravity="center" android:orientation="vertical" android:visibility="gone"> <ImageView android:id="@+id/imageView" android:layout_width="300dp" android:layout_height="100dp" android:elevation="1dp" app:srcCompat="@color/colorAccent" /> </LinearLayout> </view.ScrollWebView> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="web.WebCoreActivity"> <RelativeLayout android:id="@+id/rl_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/main"> <ImageView android:id="@+id/img_left" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_centerVertical="true" android:paddingBottom="15dp" android:paddingLeft="5dp" android:paddingRight="10dp" android:paddingTop="15dp" android:src="@drawable/back_white" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:paddingBottom="10dp" android:paddingTop="10dp" android:text="@string/loading" android:textColor="@color/white" android:textSize="20sp" /> </RelativeLayout> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <view.ScrollWebViewNative android:id="@+id/forum_context" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="@color/whitesmoke" android:scrollbars="none"> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="1dp" android:visibility="gone" /> <LinearLayout android:id="@+id/ll_loading" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:gravity="center" android:orientation="vertical" android:visibility="gone"> <ImageView android:id="@+id/imageView" android:layout_width="300dp" android:layout_height="100dp" android:elevation="1dp" app:srcCompat="@color/colorAccent" /> </LinearLayout> </view.ScrollWebViewNative> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>