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 tongzhenggang@126.com */ 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>