目录
简单的使用腾讯X5内核浏览器替代Android原生的WebView
第一步:X5官网下载SDK,引入到AndroidStudio中
第二步:如果是64位CPU手机,则需要引入一个so(liblbs.so),注意只有armeabi/armeabi-v7,千万不要引入像arme64等同arme的
第三步:代码层:
最后、本人的实例调试代码
简单的使用腾讯X5内核浏览器替代Android原生的WebView
官网地址:https://x5.tencent
理由:腾讯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.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.MalformedURLException;
import java.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/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<Uri> 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/");
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/s/1ncOA0sHcg6WCa2CPxMQmyg
提取码:7dks
更多推荐
简单的使用腾讯X5内核浏览器替代Android原生的WebView
发布评论