大家都不知道原生的WebView 存在各种坑。各种适配问题,还有在安卓7.0会造成莫名其妙的崩溃,最近在使用,总会出现DNS被拦截的情况,腾讯X5内核这个使用起来比原生webview舒服多了,大家想了解他的好处与特性的可以去官网查看腾讯TBS浏览器官网
废话不多说开始集成办法 这里有两种方法供大家挑选
第一种:手动集成 就是在按照官网的步骤一步一步集成。
第二种:引入依赖:想偷懒的同学可以使用这种,对于腾讯x5内核,我进行了二次封装 可以直接依赖调用。
第一种:手动集成
1、在官网下载安卓完整版SDK,下载后解压 其中的lib文件夹中的jar包 和jniLibs包中的so 是我们需要的 把他们复制出来粘贴到我们的项目中
2、在model的bulid中加入
defaultConfig {
...
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
...
3、在清单文件中加入权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 硬件加速对X5视频播放非常重要,建议开启 -->
<uses-permission android:name="android.permission.GET_TASKS" />
4、配置Application ,记得在清单问价中注册 不然会崩溃
public class APP extends Application {
@Override
public void onCreate() {
super.onCreate();
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
Log.d("app", " onViewInitFinished is " + arg0);
}
@Override
public void onCoreInitFinished() {
}
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
}
}
5、好了目前已经集成完毕了 , 开始使用吧 首先我们在布局文件中加入
<com.tencent.smtt.sdk.WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
注意一定要是com.tencent.smtt.sdk.包下的 不然用的还是安卓原生webview
6、Activity中代码 , 算了 时间关系 直接给大家粘贴代码吧
注意所有的包都要是com.tencent.smtt.sdk.下的 不然会有冲突 或者使用的还是原生webview
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import com.tencent.smtt.export.external.interfaces.JsResult;
import com.tencent.smtt.sdk.CookieSyncManager;
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 java.net.URL;
public class MainActivity extends AppCompatActivity {
private WebView webView;
private String mHomeUrl = "";
private URL mIntentUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
initWeb();
// webView.loadUrl("https://blog.csdn.net/qq_43143981");
}
private void initWeb() {
WebSettings webSetting = webView.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.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);
webView.setWebViewClient(webViewClient);
webView.setWebChromeClient(webChromeClient);
if (mIntentUrl == null) {
webView.loadUrl(mHomeUrl);
} else {
webView.loadUrl(mIntentUrl.toString());
}
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().sync();
}
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
//此处不能像使用系统的WebView的写法一样,强行显示在WebView中,不调用系统浏览器
//要参考demo中BrowserActivity中这里的写法,直接返回false,否则会出现网页中某得页面加载不出来的情况,别问我为什么知道,^_^,踩过坑。
/*if (!TextUtils.isEmpty(url)) {
webView.loadUrl(url);
}
return super.shouldOverrideUrlLoading(webView, url);*/
return false;
}
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
}
};
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public void onProgressChanged(WebView webView, int i) {
try {
// progress.setProgress(i);
} catch (Exception e) {
e.printStackTrace();
}
super.onProgressChanged(webView, i);
}
@Override
public void onReceivedTitle(WebView webView, String s) {
super.onReceivedTitle(webView, s);
// tvTitle.setText(s);
}
@Override
public boolean onJsConfirm(WebView webView, String s, String s1, JsResult jsResult) {
return super.onJsConfirm(webView, s, s1, jsResult);
}
};
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
// case R.id.bt_back:
// if(webView != null && webView.canGoBack()){
// webView.goBack();
// return;
// }
// finish();
// break;
default:
break;
}
}
};
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent == null || webView == null || intent.getData() == null){
return;
}
finish();
webView.loadUrl(intent.getData().toString());
}
@Override
protected void onDestroy() {
// if (unbinder != null) {
// unbinder.unbind();
// }
//一定要调用WebView的销毁
if (null != webView) {
webView.destroy();
}
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//监听返回键
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
//判断webView是否还有需要返回的页面
if(webView != null && webView.canGoBack()){
webView.goBack();
return true;
}else{
return super.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
}
第二种:引入依赖
1、在项目的build里加入
allprojects {
repositories {
...
....
maven { url 'https://jitpack.io' }
}
}
2、在model的build中加入依赖
implementation 'com.github.G452:GTXweb:0.0.2'
两部写完 点击同步项目 恭喜你已经集成完毕
3、开始调用
在Application中初始化
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
Log.d("app", " onViewInitFinished is " + arg0);
}
@Override
public void onCoreInitFinished() {
}
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
在布局中加入控件
<com.tencent.smtt.sdk.WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在Activity中,调用依赖库中的方法即可
找控件
webView = (WebView) findViewById(R.id.webView);
调用初始化工具类 参数1:链接地址,参数2:web控件,参数3:上下文context
TXwebutiles.initweb(mUrl, webView, this);
大功告成,之后可以继续添加web的销毁,缓存,返回键等优化 上面有 ,这里就不写了