android 腾讯x5浏览器,【Android Web】腾讯X5浏览器的集成与常见问题
前言
近年来,混合开发也越来越用的更多,而原生webview的各种坑,比如说 上传图片、文件问题、视频全屏问题(什么在微信上打开都是好的,你这怎么全屏不了)、版本差异问题,所以还是建议使用腾讯x5浏览器。
如何使用
1.去官网上下载最新的jar、so文件等 链接点这里
2.添加jar包、so文件,配置gradle
QQ截图20180728102235.png
在build.gradle 中添加libs、配置ndk
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
ndk {
abiFilters "armeabi"
}
3.在Application中添加初始化x5代码,记得在AndroidManifest.xml中注册你自定的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);
4.添加权限
5.添加WebActivity,初始化x5配置 记得在AndroidManifest.xml中注册
webView = (WebView) findViewById(R.id.webView);
WebSettings webSetting = webView.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setBuiltInZoomControls(false);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(true);
// webSetting.setLoadWithOverviewMode(true);
webSetting.setAppCacheEnabled(true);
// webSetting.setDatabaseEnabled(true);
webSetting.setDomStorageEnabled(true);
webSetting.setGeolocationEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
// webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
webView.getView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
// this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
// settings 的设计
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
webView.loadUrl(url);
return true;
}
});
6、添加上传文件、图片适配代码
webView.setWebChromeClient(new WebChromeClient() {
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android < 3.0
public void openFileChooser(ValueCallback uploadMsgs) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android >= 5.0
public boolean onShowFileChooser(com.tencent.smtt.sdk.WebView webView,
ValueCallback filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
uploadFiles = filePathCallback;
openFileChooseProcess();
return true;
}
});
private void openFileChooseProcess() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
startActivityForResult(Intent.createChooser(i, "test"), 0);
}
7、处理选择文件、图片后回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
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;
}
if (null != uploadFiles) {
Uri result = data == null || resultCode != RESULT_OK ? null
: data.getData();
uploadFiles.onReceiveValue(new Uri[]{result});
uploadFiles = null;
}
break;
default:
break;
}
} else if (resultCode == RESULT_CANCELED) {
if (null != uploadFile) {
uploadFile.onReceiveValue(null);
uploadFile = null;
}
}
}
8、添加视频全屏相关代码
webView.setWebChromeClient(new WebChromeClient() {
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android < 3.0
public void openFileChooser(ValueCallback uploadMsgs) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
uploadFile = uploadFile;
openFileChooseProcess();
}
// For Android >= 5.0
public boolean onShowFileChooser(com.tencent.smtt.sdk.WebView webView,
ValueCallback filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
uploadFiles = filePathCallback;
openFileChooseProcess();
return true;
}
View myVideoView;
View myNormalView;
IX5WebChromeClient.CustomViewCallback callback;
/**
* 全屏播放配置
*/
@Override
public void onShowCustomView(View view,
IX5WebChromeClient.CustomViewCallback customViewCallback) {
FrameLayout normalView = (FrameLayout) findViewById(R.id.web_filechooser);
ViewGroup viewGroup = (ViewGroup) normalView.getParent();
viewGroup.removeView(normalView);
viewGroup.addView(view);
myVideoView = view;
myNormalView = normalView;
callback = customViewCallback;
}
@Override
public void onHideCustomView() {
if (callback != null) {
callback.onCustomViewHidden();
callback = null;
}
if (myVideoView != null) {
ViewGroup viewGroup = (ViewGroup) myVideoView.getParent();
viewGroup.removeView(myVideoView);
viewGroup.addView(myNormalView);
}
}
});
webView.addJavascriptInterface(new WebViewJavaScriptFunction() {
@Override
public void onJsFunctionCalled(String tag) {
}
@JavascriptInterface
public void onX5ButtonClicked() {
enableX5FullscreenFunc();
}
@JavascriptInterface
public void onCustomButtonClicked() {
disableX5FullscreenFunc();
}
@JavascriptInterface
public void onLiteWndButtonClicked() {
enableLiteWndFunc();
}
@JavascriptInterface
public void onPageVideoClicked() {
enablePageVideoFunc();
}
}, "Android");
// 向webview发出信息
private void enableX5FullscreenFunc() {
if (webView.getX5WebViewExtension() != null) {
Bundle data = new Bundle();
data.putBoolean("standardFullScreen", false);// true表示标准全屏,false表示X5全屏;不设置默认false,
data.putBoolean("supportLiteWnd", false);// false:关闭小窗;true:开启小窗;不设置默认true,
data.putInt("DefaultVideoScreen", 2);// 1:以页面内开始播放,2:以全屏开始播放;不设置默认:1
webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",
data);
}
}
private void disableX5FullscreenFunc() {
if (webView.getX5WebViewExtension() != null) {
Bundle data = new Bundle();
data.putBoolean("standardFullScreen", true);// true表示标准全屏,会调起onShowCustomView(),false表示X5全屏;不设置默认false,
data.putBoolean("supportLiteWnd", false);// false:关闭小窗;true:开启小窗;不设置默认true,
data.putInt("DefaultVideoScreen", 2);// 1:以页面内开始播放,2:以全屏开始播放;不设置默认:1
webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",
data);
}
}
private void enableLiteWndFunc() {
if (webView.getX5WebViewExtension() != null) {
Bundle data = new Bundle();
data.putBoolean("standardFullScreen", false);// true表示标准全屏,会调起onShowCustomView(),false表示X5全屏;不设置默认false,
data.putBoolean("supportLiteWnd", true);// false:关闭小窗;true:开启小窗;不设置默认true,
data.putInt("DefaultVideoScreen", 2);// 1:以页面内开始播放,2:以全屏开始播放;不设置默认:1
webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",
data);
}
}
private void enablePageVideoFunc() {
if (webView.getX5WebViewExtension() != null) {
Bundle data = new Bundle();
data.putBoolean("standardFullScreen", false);// true表示标准全屏,会调起onShowCustomView(),false表示X5全屏;不设置默认false,
data.putBoolean("supportLiteWnd", false);// false:关闭小窗;true:开启小窗;不设置默认true,
data.putInt("DefaultVideoScreen", 1);// 1:以页面内开始播放,2:以全屏开始播放;不设置默认:1
webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",
data);
}
}
9、添加下载相关代码
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String s, String s1, String s2, String s3, long l) {
}
});
10、最后,当Activity销毁时,释放webview
/**
* 确保注销配置能够被释放
*/
@Override
protected void onDestroy() {
if (this.webView != null) {
webView.destroy();
}
super.onDestroy();
}
到这里,x5浏览器的集成已经完成了,快去试试吧
常见问题
1.视频无法全屏
请注意AndroidManifest.xml 中配置
android:name=".WebActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
2.原生与webview 共享cookie
首先,原生需要将cookie 持久化的保存起来,具体可以参考 【Android架构】基于MVP模式的Retrofit2+RXjava封装之常见问题(四),至于非okhttp网络的,可以自行百度
然后传递给webview
//创建CookieSyncManager
CookieSyncManager.createInstance(context);
//得到CookieManager
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
cookieManager.removeAllCookie();
//得到向URL中添加的Cookie的值
store = new PersistentCookieStore(context);
List cookieList = store.getCookies();
if (cookieList != null && cookieList.size() > 0) {
Cookie cookie = null;
for (Cookie c : cookieList) {
if (c.domain() != null) {
if (c.domain().contains("38")) {
cookie = c;
}
}
}
if (cookie == null) {
cookie = cookieList.get(0);
}
cookieManager.setCookie(url, cookie.name() + "=" + cookie.value());
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.getInstance().sync();
} else {
CookieManager.getInstance().flush();
}
}
需要注意的是,本地保存的cookie可能会有多个,要根据domain 来判断出正确的cookie
android 腾讯x5浏览器,【Android Web】腾讯X5浏览器的集成与常见问题相关推荐
- android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法
Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...
- 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...
做了个Android项目,需要接入新浪微博,实现时也顺带着研究了下腾讯微博和人人网的Android客户端接入,本文就跟大家分享下三者的Android客户端接入方法. 一.实例概述 说白了,接入微博就是 ...
- 腾讯 android ui,腾讯开源的Android UI框架——QMUI Android
各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊.嗯,先冷静捋一下,卖个关子.扯回正题,今天继续为大家推荐一个Githu ...
- android 代码浏览,Webview实现android简单的浏览器实例代码
WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webv ...
- android用qq浏览器打开微信网页版,QQ浏览器怎么打开微信小程序?
继微信.QQ 之后,QQ 浏览器上也可以使用小程序了. 现已实现与微信小程序打通.QQ 浏览器 Android 版现已上线小程序,在搜索的场景下,小程序嵌入 QQ 浏览器「搜索直达」,作为直接的内容承 ...
- 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身
9月21日,腾讯发布了手机QQ浏览器 (Android) 2.6版本.在官方的版本介绍中,提到了许多起始页上的变化,例如起始页快链增加为16个.起始页增加内容导航可一键直达内容区.此外,还增加了应用中 ...
- android手机浏览器研究报告,QQ浏览器Android客户端产品体验报告
概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:QQ浏览器Android客户端 软件版本:5.7.2.1400 需求分析 目标人群:所有移动互联网网民 使用场 ...
- android html 打开摄像头,在android上,用WEB页面打开手机摄像头
今天看到一个人提问,怎么在android上用web页面打开手机摄像头.刚好我们之前也做过类似的工程,刚好把想法写一下: 1.基本原理: 页面上做一个按钮,如打开摄像头,它做的事情就是将页面链接到一个特 ...
- jquery mobile android浏览器,使用jQuery Mobile实现新闻浏览器(3)
[IT168 技术]在本教程的前两篇文章中,笔者分别向大家介绍了使用jQuery Mobile框架如何去设计手机新闻浏览器,其中实现了一个WEB版本的新闻浏览器,在本教程的最后一篇中,将讲解如何将已实 ...
- Android百度地图、高德地图、腾讯地图导航路线规划问题
Android百度地图.高德地图.腾讯地图导航路线规划 在最近的项目中,需求是用户选择某个地址需要进行导航时,弹出百度地图.高德地图和腾讯地图让用户选择.如果该用户手机中已安装对应的地图App,则 ...
最新文章
- Apollo代码学习(六)—模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
- Java多线程Socket在控制台输出的多人聊天室编程
- 初次尝试使用Windbg调试Sql Server 进程
- 写代码的16个好习惯,减少80%的bug
- 浅谈物联网时代智能停车发展趋势
- python的scikit-learn算法库实现
- vm虚拟远程部署windows驱动
- 无悔入华夏怎么一直显示服务器,无悔入华夏新手开局玩法 无悔入华夏新手攻略开局带的...
- HetSANN:基于注意力模型,自动挖掘异质网络语义信息 AAAI2020
- python函数传值还是地址_python中给函数传参是传值还是传引用
- 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
- DNA 测序技术的发展:第三代测序法
- 电子密码锁程序C语言,基于C语言STC89C52单片机电子密码锁的系统设计与仿真
- RxSwift学习记录
- 计算机考证报名时间表
- 微信小程序生命周期笔记
- moviepy音视频开发:音频合成类AudioArrayClip介绍
- 神奇的口袋 C++ 三种方法(枚举,递归,动态规划)
- Android框架排行榜,上百项资源汇总不容错过
- 新型冠状病毒之物资的分配