简单的使用腾讯X5内核浏览器替代Android原生的WebView
16lz
2021-01-23
目录
简单的使用腾讯X5内核浏览器替代Android原生的WebView
第一步:X5官网下载SDK,引入到AndroidStudio中
第二步:如果是64位CPU手机,则需要引入一个so(liblbs.so),注意只有armeabi/armeabi-v7,千万不要引入像arme64等同arme的
第三步:代码层:
最后、本人的实例调试代码
简单的使用腾讯X5内核浏览器替代Android原生的WebView
官网地址:https://x5.tencent.com
理由:腾讯X5加载更多,显示更好,很多用原生WebView无法兼容从而无法显示的图片、页面基本都可以使用,微信、QQ的HTML加载都是用QQ浏览器X5内核的
第一步:X5官网下载SDK,引入到AndroidStudio中
第二步:如果是64位CPU手机,则需要引入一个so(liblbs.so),注意只有armeabi/armeabi-v7,千万不要引入像arme64等同arme的
作用是:把64位的软件统一转成32位打包运行
第三步:代码层:
1、MyAppplication
package com.telit.x5;import android.app.Application;import android.util.Log;import com.tencent.smtt.sdk.QbSdk;/** * author: qzx * Date: 2019/8/7 18:54 */public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { @Override public void onViewInitFinished(boolean arg0) { // TODO Auto-generated method stub //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。 Log.e("zbv", " onViewInitFinished is " + arg0); } @Override public void onCoreInitFinished() { // TODO Auto-generated method stub } }; //x5内核初始化接口 QbSdk.initX5Environment(getApplicationContext(), cb); }}
二、BrowerActivity[官网示例代码,把视频播放的砍掉了,重点看加了注释的代码]
package com.telit.x5;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.PixelFormat;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Process;import android.text.Editable;import android.text.TextWatcher;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnFocusChangeListener;import android.view.ViewGroup;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.ImageButton;import android.widget.ProgressBar;import android.widget.Toast;import com.telit.x5.utils.x5.X5WebView;import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient.CustomViewCallback;import com.tencent.smtt.export.external.interfaces.JsResult;import com.tencent.smtt.sdk.CookieSyncManager;import com.tencent.smtt.sdk.DownloadListener;import com.tencent.smtt.sdk.ValueCallback;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 com.tencent.smtt.utils.TbsLog;import java.net.MalformedURLException;import java.net.URL;public class BrowserActivity extends Activity { /** * 作为一个浏览器的示例展示出来,采用android+web的模式 */ private X5WebView mWebView; private ViewGroup mViewParent; private ImageButton mBack; private ImageButton mForward; private ImageButton mExit; private ImageButton mHome; private ImageButton mMore; private Button mGo; private EditText mUrl; private static final String mHomeUrl = "http://119.3.243.43:8089/pptpage/qwfl/index.html"; // private static final String mHomeUrl = "http://app.html5.qq.com/navi/index"; private static final String TAG = "SdkDemo"; private static final int MAX_LENGTH = 14; private boolean mNeedTestPage = false; private final int disable = 120; private final int enable = 255; private ProgressBar mPageLoadingProgressBar = null; private ValueCallback uploadFile; private URL mIntentUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); Intent intent = getIntent(); if (intent != null) { try { mIntentUrl = new URL(intent.getData().toString()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (NullPointerException e) { } catch (Exception e) { } } // try { if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 11) { getWindow() .setFlags( android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } } catch (Exception e) { } /* * getWindow().addFlags( * android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN); */ setContentView(R.layout.activity_browser); mViewParent = (ViewGroup) findViewById(R.id.webView1); initBtnListenser(); mTestHandler.sendEmptyMessageDelayed(MSG_INIT_UI, 10); } private void changGoForwardButton(WebView view) { if (view.canGoBack()) mBack.setAlpha(enable); else mBack.setAlpha(disable); if (view.canGoForward()) mForward.setAlpha(enable); else mForward.setAlpha(disable); if (view.getUrl() != null && view.getUrl().equalsIgnoreCase(mHomeUrl)) { mHome.setAlpha(disable); mHome.setEnabled(false); } else { mHome.setAlpha(enable); mHome.setEnabled(true); } } private void initProgressBar() { mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);// new // ProgressBar(getApplicationContext(), // null, // android.R.attr.progressBarStyleHorizontal); mPageLoadingProgressBar.setMax(100); mPageLoadingProgressBar.setProgressDrawable(this.getResources() .getDrawable(R.drawable.color_progressbar)); } private void init() { mWebView = new X5WebView(this, null); mViewParent.addView(mWebView, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT)); initProgressBar(); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // mTestHandler.sendEmptyMessage(MSG_OPEN_TEST_URL); mTestHandler.sendEmptyMessageDelayed(MSG_OPEN_TEST_URL, 5000);// 5s? if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 16) changGoForwardButton(view); /* mWebView.showLog("test Log"); */ } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsConfirm(WebView arg0, String arg1, String arg2, JsResult arg3) { return super.onJsConfirm(arg0, arg1, arg2, arg3); } View myVideoView; View myNormalView; CustomViewCallback callback; mWebView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String arg0, String arg1, String arg2, String arg3, long arg4) { TbsLog.d(TAG, "url: " + arg0); new AlertDialog.Builder(BrowserActivity.this) .setTitle("allow to download?") .setPositiveButton("yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText( BrowserActivity.this, "fake message: i'll download...", Toast.LENGTH_LONG).show(); } }) .setNegativeButton("no", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Toast.makeText( BrowserActivity.this, "fake message: refuse download...", Toast.LENGTH_SHORT).show(); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // TODO Auto-generated method stub Toast.makeText( BrowserActivity.this, "fake message: refuse download...", Toast.LENGTH_SHORT).show(); } }).show(); } }); WebSettings webSetting = mWebView.getSettings(); webSetting.setAllowFileAccess(true); webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); webSetting.setSupportZoom(true); webSetting.setBuiltInZoomControls(true); webSetting.setUseWideViewPort(true); webSetting.setSupportMultipleWindows(false); // webSetting.setLoadWithOverviewMode(true); webSetting.setAppCacheEnabled(true); // webSetting.setDatabaseEnabled(true); webSetting.setDomStorageEnabled(true); webSetting.setJavaScriptEnabled(true); webSetting.setGeolocationEnabled(true); webSetting.setBlockNetworkImage(false); webSetting.setAppCacheMaxSize(Long.MAX_VALUE); webSetting.setAppCachePath(this.getDir("appcache", 0).getPath()); webSetting.setDatabasePath(this.getDir("databases", 0).getPath()); webSetting.setGeolocationDatabasePath(this.getDir("geolocation", 0) .getPath()); // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY); webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND); // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH); // webSetting.setPreFectch(true); long time = System.currentTimeMillis(); //使用前先判断X5内核是否加载好了,是否可用 if (mWebView.getX5WebViewExtension() != null) { Toast.makeText(this, "已加载X5内核", Toast.LENGTH_SHORT).show(); if (mIntentUrl == null) { mWebView.loadUrl(mHomeUrl); } else { mWebView.loadUrl(mIntentUrl.toString()); } } else { //加载内核失败主要原因应该是64位手机整合liblbs的so的问题,还有可能就是内核因为特殊情况没有加载的情况,这种就是进入调试模式,手动下载内核,见官网手册 mWebView.loadUrl("https://debugtbs.qq.com/"); Toast.makeText(this, "抱歉,X5内核未加载", Toast.LENGTH_SHORT).show(); return; } TbsLog.d("time-cost", "cost time: " + (System.currentTimeMillis() - time)); CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().sync(); } private void initBtnListenser() { mBack = (ImageButton) findViewById(R.id.btnBack1); mForward = (ImageButton) findViewById(R.id.btnForward1); mExit = (ImageButton) findViewById(R.id.btnExit1); mHome = (ImageButton) findViewById(R.id.btnHome1); mGo = (Button) findViewById(R.id.btnGo1); mUrl = (EditText) findViewById(R.id.editUrl1); mMore = (ImageButton) findViewById(R.id.btnMore); if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 16) { mBack.setAlpha(disable); mForward.setAlpha(disable); mHome.setAlpha(disable); } mHome.setEnabled(false); mBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mWebView != null && mWebView.canGoBack()) mWebView.goBack(); } }); mForward.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mWebView != null && mWebView.canGoForward()) mWebView.goForward(); } }); mGo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String url = mUrl.getText().toString(); mWebView.loadUrl(url); mWebView.requestFocus(); } }); mMore.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(BrowserActivity.this, "not completed", Toast.LENGTH_LONG).show(); } }); mUrl.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { mGo.setVisibility(View.VISIBLE); if (null == mWebView.getUrl()) return; if (mWebView.getUrl().equalsIgnoreCase(mHomeUrl)) { mUrl.setText(""); mGo.setText("首页"); mGo.setTextColor(0X6F0F0F0F); } else { mUrl.setText(mWebView.getUrl()); mGo.setText("进入"); mGo.setTextColor(0X6F0000CD); } } else { mGo.setVisibility(View.GONE); String title = mWebView.getTitle(); if (title != null && title.length() > MAX_LENGTH) mUrl.setText(title.subSequence(0, MAX_LENGTH) + "..."); else mUrl.setText(title); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } }); mUrl.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub String url = null; if (mUrl.getText() != null) { url = mUrl.getText().toString(); } if (url == null || mUrl.getText().toString().equalsIgnoreCase("")) { mGo.setText("请输入网址"); mGo.setTextColor(0X6F0F0F0F); } else { mGo.setText("进入"); mGo.setTextColor(0X6F0000CD); } } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); mHome.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mWebView != null) mWebView.loadUrl(mHomeUrl); } }); mExit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Process.killProcess(Process.myPid()); } }); } boolean[] m_selected = new boolean[]{true, true, true, true, false, false, true}; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (mWebView != null && mWebView.canGoBack()) { mWebView.goBack(); if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 16) changGoForwardButton(mWebView); return true; } else return super.onKeyDown(keyCode, event); } return super.onKeyDown(keyCode, event); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { TbsLog.d(TAG, "onActivityResult, requestCode:" + requestCode + ",resultCode:" + resultCode); if (resultCode == RESULT_OK) { switch (requestCode) { case 0: if (null != uploadFile) { Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); uploadFile.onReceiveValue(result); uploadFile = null; } break; default: break; } } else if (resultCode == RESULT_CANCELED) { if (null != uploadFile) { uploadFile.onReceiveValue(null); uploadFile = null; } } } @Override protected void onNewIntent(Intent intent) { if (intent == null || mWebView == null || intent.getData() == null) return; mWebView.loadUrl(intent.getData().toString()); } @Override protected void onDestroy() { if (mTestHandler != null) mTestHandler.removeCallbacksAndMessages(null); if (mWebView != null) mWebView.destroy(); super.onDestroy(); } public static final int MSG_OPEN_TEST_URL = 0; public static final int MSG_INIT_UI = 1; private final int mUrlStartNum = 0; private int mCurrentUrl = mUrlStartNum; private Handler mTestHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_OPEN_TEST_URL: if (!mNeedTestPage) { return; } String testUrl = "file:///sdcard/outputHtml/html/" + Integer.toString(mCurrentUrl) + ".html"; if (mWebView != null) { mWebView.loadUrl(testUrl); } mCurrentUrl++; break; case MSG_INIT_UI: init(); break; } super.handleMessage(msg); } };}
最后、本人的实例调试代码
链接:https://pan.baidu.com/s/1ncOA0sHcg6WCa2CPxMQmyg
提取码:7dks
更多相关文章
- Android中关于Volley的使用(一)加载图片
- 《Android系统源代码情景分析》连载回忆录:灵感之源
- 【转】Android内核开发:如何统计系统的启动时间
- Android 一种在Dalvik虚拟机上多Dex加载优化的方案
- 在Ubuntu上下载、编译和安装Android最新源代码
- Android 8.0 学习(4)---Android通用内核
- Android系统源代码情景分析 第3版