前言

近年来,混合开发也越来越用的更多,而原生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浏览器的集成与常见问题相关推荐

  1. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  2. 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...

    做了个Android项目,需要接入新浪微博,实现时也顺带着研究了下腾讯微博和人人网的Android客户端接入,本文就跟大家分享下三者的Android客户端接入方法. 一.实例概述 说白了,接入微博就是 ...

  3. 腾讯 android ui,腾讯开源的Android UI框架——QMUI Android

    各位同学,早上好,我是你们的老朋友D_clock爱吃葱花,前些天忙着发版本,最近也在看各种各样的新知识,有好多东西想写啊啊啊啊啊.嗯,先冷静捋一下,卖个关子.扯回正题,今天继续为大家推荐一个Githu ...

  4. android 代码浏览,Webview实现android简单的浏览器实例代码

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webv ...

  5. android用qq浏览器打开微信网页版,QQ浏览器怎么打开微信小程序?

    继微信.QQ 之后,QQ 浏览器上也可以使用小程序了. 现已实现与微信小程序打通.QQ 浏览器 Android 版现已上线小程序,在搜索的场景下,小程序嵌入 QQ 浏览器「搜索直达」,作为直接的内容承 ...

  6. 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身

    9月21日,腾讯发布了手机QQ浏览器 (Android) 2.6版本.在官方的版本介绍中,提到了许多起始页上的变化,例如起始页快链增加为16个.起始页增加内容导航可一键直达内容区.此外,还增加了应用中 ...

  7. android手机浏览器研究报告,QQ浏览器Android客户端产品体验报告

    概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:QQ浏览器Android客户端 软件版本:5.7.2.1400 需求分析 目标人群:所有移动互联网网民 使用场 ...

  8. android html 打开摄像头,在android上,用WEB页面打开手机摄像头

    今天看到一个人提问,怎么在android上用web页面打开手机摄像头.刚好我们之前也做过类似的工程,刚好把想法写一下: 1.基本原理: 页面上做一个按钮,如打开摄像头,它做的事情就是将页面链接到一个特 ...

  9. jquery mobile android浏览器,使用jQuery Mobile实现新闻浏览器(3)

    [IT168 技术]在本教程的前两篇文章中,笔者分别向大家介绍了使用jQuery Mobile框架如何去设计手机新闻浏览器,其中实现了一个WEB版本的新闻浏览器,在本教程的最后一篇中,将讲解如何将已实 ...

  10. Android百度地图、高德地图、腾讯地图导航路线规划问题

      Android百度地图.高德地图.腾讯地图导航路线规划 在最近的项目中,需求是用户选择某个地址需要进行导航时,弹出百度地图.高德地图和腾讯地图让用户选择.如果该用户手机中已安装对应的地图App,则 ...

最新文章

  1. Apollo代码学习(六)—模型预测控制(MPC)_follow轻尘的博客-CSDN博客_mpc代码
  2. Java多线程Socket在控制台输出的多人聊天室编程
  3. 初次尝试使用Windbg调试Sql Server 进程
  4. 写代码的16个好习惯,减少80%的bug
  5. 浅谈物联网时代智能停车发展趋势
  6. python的scikit-learn算法库实现
  7. vm虚拟远程部署windows驱动
  8. 无悔入华夏怎么一直显示服务器,无悔入华夏新手开局玩法 无悔入华夏新手攻略开局带的...
  9. HetSANN:基于注意力模型,自动挖掘异质网络语义信息 AAAI2020
  10. python函数传值还是地址_python中给函数传参是传值还是传引用
  11. 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
  12. DNA 测序技术的发展:第三代测序法
  13. 电子密码锁程序C语言,基于C语言STC89C52单片机电子密码锁的系统设计与仿真
  14. RxSwift学习记录
  15. 计算机考证报名时间表
  16. 微信小程序生命周期笔记
  17. moviepy音视频开发:音频合成类AudioArrayClip介绍
  18. 神奇的口袋 C++ 三种方法(枚举,递归,动态规划)
  19. Android框架排行榜,上百项资源汇总不容错过
  20. 新型冠状病毒之物资的分配

热门文章

  1. 苹果mac休眠快捷键_史上最详细的苹果Macbook快捷键使用
  2. 计算机女学霸,邹楚杭:计算机学院走出来的才女学霸
  3. Docker基本使用教程
  4. 你真的会使用“布尔类型(Boolean)”么?
  5. 大疆A型板使用经验分享(八)——FreeRTOS操作系统的使用
  6. Android初试--了解和认识Android
  7. 极简椭圆曲线密码学入门
  8. 超级电视与海信电视争第一,这是一场胜负已定的战争
  9. java以前版本下载方式
  10. mysql插入成功返回主键_MyBatis + MySQL返回插入成功后的主键id