腾讯浏览服务官网
https://x5.tencent.com/tbs/index.html
配置:下载sdk,并导入jar文件和so文件
android {
...
defaultConfig {
...
// 这里比较坑,当时用极光推送把64位的ndk库也加上了,x5内核初始化一直失败
// 这里要去掉所有64位库,x5内核才能加载成功
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Application进行初始化
// dex2oat优化方案
HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
QbSdk.initTbsSettings(map);
// 默认false wifi环境下不会下载内核,true 使用流量也可以下载内核
// 首次下载内核 downloadWithoutWife = false,不会回调PreInitCallback
// 非首次,即已经成功下载内核 downloadWithoutWife = false,也会回调PreInitCallback
// QbSdk.setDownloadWithoutWifi(true);
QbSdk.initX5Environment(application, new QbSdk.PreInitCallback() {
@Override
public void onCoreInitFinished() {
// 内核初始化完成,可能为系统内核,也可能为系统内核
}
/**
* 预初始化结束
* 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
* @param isX5 是否使用X5内核
*/
@Override
public void onViewInitFinished(boolean isX5) {
if (!isX5)
// 如果是false,需要重新下载内核
TbsDownloader.startDownload(application);
}
});
如何使用
主要用到这个类TbsReaderView
来打开文件,这个View必须用代码动态创建
。
private void openFile(String path) {
//通过bundle把文件传给x5,打开的事情交由x5处理
Bundle bundle = new Bundle();
//传递文件路径
bundle.putString("filePath", path);
//临时的路径
bundle.putString("tempPath", Environment.getExternalStorageDirectory() + File.separator + "temp");
TbsReaderView readerView = new TbsReaderView(this, new TbsReaderView.ReaderCallback() {
@Override
public void onCallBackAction(Integer integer, Object o, Object o1) {
}
});
//加载文件前的初始化工作,加载支持不同格式的插件
boolean b = readerView.preOpen(getFileType(path), false);
if (b) {
readerView.openFile(bundle);
}
// 往容器里添加TbsReaderView控件
frameLayout.addView(readerView);
}
/***
* 获取文件类型
*
* @param path 文件路径
* @return 文件的格式
*/
private String getFileType(String path) {
String str = "";
if (TextUtils.isEmpty(path)) {
return str;
}
int i = path.lastIndexOf('.');
if (i <= -1) {
return str;
}
str = path.substring(i + 1);
return str;
}
@Override
protected void onDestroy() {
super.onDestroy();
// 一定要调用此方法,才能选择下一个文件预览
// 否则显示loading而不展示
// 适当的位置调用此方法
readerView.onStop();
}
可通过getX5WebViewExtension()方法判断当前设备是否支持x5内核
import com.tencent.smtt.sdk.WebView;
public class X5WebView extends WebView {
public X5WebView(Context context) {
super(context);
}
}
不为null则支持x5内核
new X5WebView(this).getX5WebViewExtension() != null