最新Android在项目中接入腾讯TBS浏览器WebView的教程与注意的地方,2024年最新kotlin教学视频

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 1

  • 2

在非硬绘手机和声明需要controller的网页上,视频切换全屏和全屏切换回页面内会出现视频窗口透明问题,需要在activity的style进行如下设置:

<!-- 声明为不透明,这个视各app情况所需,不强制需求,如果声明了,对体验更有利 --> <item name="android:windowIsTranslucent">false</item>。

  • 1

  • 2

  • 3

  • 4

以下接口禁止(直接或反射)调用,避免视频画面无法显示:

webview.setLayerType() webview.setDrawingCacheEnabled(true);

  • 1

  • 2

2. 输入法

避免输入法界面弹出后遮挡输入光标的问题,所在的Activity添加属性:

android:windowSoftInputMode="stateHidden|adjustResize"

  • 1

或者 在ActivityonCreate时候代码设置也行:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

  • 1
3. 自定义UA

UA是什么?

userAgent,用户代理。是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。作用就是告诉网页我这个是什么系统。

如果 app 需要自定义 UA,建议采取在 SDK 默认UA 后追加 app UA 的方式。示例:

//其中APP_NAME_UA是app自定义UA webSetting.setUserAgentString(webSetting.getUserAgentString() + APP_NAME_UA);

  • 1

  • 2

  • 3

4. 额外的视频播放器

没错,这货还提供了一个视频播放的功能,下面官方的说明:

TBS不仅提供了强大的网页浏览功能,更提供了强大的页面H5视频播放支持,播放器同时支持页面,小窗,全屏播放体验,强大的解码能力,包括mp4,rmvb,flv,avi等26种视频格式支持。

TBS播放器的播放场景不仅局限于H5页面播放,也可以接入一般的视频流链接,比如本地文件,网络的视频流链接。开发者如果想播放一个视频链接,在不自己开发播放器的前提下,一般做法是将视频的播放链接放到一个Intent里面,抛给系统的播放器进行播放,那么当你集成了TBS后,你只需要通过简单的方式接入视频播放调用接口,这样你不需要写任何一句关于播放器的代码,就可以享受一个本地播放器体验,播放视频再不需要Intent来跨App、跨进程的调用了。

第一步,在Manifest添加Activity声明:

<activity android:name="com.tencent.smtt.sdk.VideoActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:exported="false" android:launchMode="singleTask" android:alwaysRetainTaskState="true"> <intent-filter> <action android:name="com.tencent.smtt.tbs.video.PLAY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

第二步,调用播放视频的调用接口,通过TbsVideo的静态方法,如下:

//判断当前Tbs播放器是否已经可以使用。 public static boolean canUseTbsPlayer(Context context) //直接调用播放接口,传入视频流的url public static void openVideo(Context context, String videoUrl) //extraData对象是根据定制需要传入约定的信息,没有需要可以传如null public static void openVideo(Context context, String videoUrl, Bundle extraData)

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

5. 文件选择器

官方demo中有。简单说一下流程

WebChromeClient里面有回调openFileChooser、onShowFileChooser方法。

点击了网页的控件就可以回调上面的方法

在回调方法里面我们利用Intent打开文件选择器

然后选择完文件后在onActivityResult回调里面进行获取,然后利用ValueCallback<Uri>或者ValueCallback<Uri[]>onReceiveValue进行返回路径给网页。

注意的地方


1. cookie的调整

com.tencent.smtt.sdk.CookieManagercom.tencent.smtt.sdk.CookieSyncManager的相关接口的调用,在接入SDK后,需要放到创建X5的WebView之后(也就是X5内核加载完成)进行;否则,cookie的相关操作只能影响系统内核。

2. WebView宽高的获取

由于SDK WebView所提供的WebView类,是对系统WebView的聚合包装,所以:获取系统内核的WebView或者 x5内核的WebView的宽高需要这样:

webView.getView().getWidth();

  • 1
3. X5内核

开始说了,这个腾讯的WebView使用的是自己的X5内核。

如果你的手机有安装QQ、微信、QQ浏览器等等QQ的产品, 这个内核就已经是已经安装到手机上了。

如果都没有,在Application初始化调用initX5Environment方法的时候,会进行离线安装,失败就会自动切换自用自带内核。

如果都都没有,而且手机没有链接网络,需要离线,这时候需要打包内核进app,app包增大20M左右, X5内核在哪里下载? 联系这货: http://bbs.mb.qq.com/user/196302

那怎么判断他是使用X5内核还是自带内核呢?

显示网页文字时,可通过长按选择文字的标识判断,如下水滴状选择效果是x5webview的标志:

image

4. 64位手机的兼容

x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行。具体操作如下:

如果使用是Eclipse

需要将所有的.so文件都放置在so加载目录:lib/armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网http://x5.tencent.com/tbs/sdk.html下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),lib文件夹下不要有其他以”armeabi“开头的文件夹。

如果使用的是Android Studio:

1、打开对应module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(如果没有defaultConfig{}则手动添加),添加如下配置:

ndk{ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" }

  • 1

  • 2

  • 3

如果配置后编译报错,那么需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;

2、打开http://x5.tencent.com/tbs/sdk.html,下载SDK接入示例,拷贝对应目录下的liblbs.so文件,到你的armeabi目录下,具体可以参考他的栗子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个链接查看64位的手机,你没有64位的手机的话,可以看看下面有什么手机是64位的,去优测里面进行测试

http://product.pconline.com.cn/mobile/qg/c6427_c14390/s5.shtml

5. 混淆

jar包本来就已经是混淆好的了,如果你打包时候没有添加规则再混淆一遍的话,就会无法使用x5内核了。所以需要添加混淆规则:

下载混淆文件:http://res.imtt.qq.com/TES/proguard.zip

解压后用文本编辑器打开,复制里面的内容到你项目的proguard-rules.pro混淆文件即可。

简单包装


如果在项目中使用,一般来说最好是封装多一层。

  • 防止和原生的WebView搞混

  • 有什么问题,一改全改。

  • 可以添加一些功能,例如进度条等。

这里给一个简单加进度条的封装,在项目中使用的话,你在布局文件里面使用路径+ProgressWebview即可

public class ProgressWebview extends WebView { private ProgressBar progressbar; //进度条 private int progressHeight = 10; //进度条的高度,默认10px public ProgressWebview(Context context) { super(context); initView(context); } public ProgressWebview(Context context, AttributeSet attributeSet) { super(context, attributeSet); initView(context); } private void initView(Context context) { //开启js脚本支持 getSettings().setJavaScriptEnabled(true); //创建进度条 progressbar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal); //设置加载进度条的高度 progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0)); Drawable drawable = context.getResources().getDrawable(R.drawable.progress_bar_states); progressbar.setProgressDrawable(drawable); //添加进度到WebView addView(progressbar); //适配手机大小 getSettings().setUseWideViewPort(true); getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); getSettings().setLoadWithOverviewMode(true); getSettings().setSupportZoom(true); getSettings().setBuiltInZoomControls(true); getSettings().setDisplayZoomControls(false); setWebChromeClient(new WVChromeClient()); setWebViewClient(new WVClient()); } //进度显示 private class WVChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { progressbar.setVisibility(GONE); } else { if (progressbar.getVisibility() == GONE) progressbar.setVisibility(VISIBLE); progressbar.setProgress(newProgress); } if (mListener != null) { mListener.onProgressChange(view, newProgress); } super.onProgressChanged(view, newProgress); } } private class WVClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //在当前Activity打开 view.loadUrl(url); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { //https忽略证书问题 handler.proceed(); } @Override public void onPageFinished(WebView view, String url) { progressbar.setVisibility(GONE); if (mListener != null) { mListener.onPageFinish(view); } super.onPageFinished(view, url); } } private onWebViewListener mListener; public void setOnWebViewListener(onWebViewListener listener) { this.mListener = listener; } //进度回调接口 public interface onWebViewListener { void onProgressChange(WebView view, int newProgress); void onPageFinish(WebView view); } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

  • 44

  • 45

  • 46

  • 47

  • 48

  • 49

  • 50

  • 51

  • 52

  • 53

  • 54

  • 55

  • 56

  • 57

  • 58

  • 59

  • 60

  • 61

  • 62

  • 63

  • 64

  • 65

  • 66

  • 67

  • 68

  • 69

  • 70

  • 71

  • 72

  • 73

  • 74

  • 75

  • 76

  • 77

  • 78

  • 79

  • 80

  • 81

  • 82

  • 83

  • 84

  • 85

  • 86

  • 87

  • 88

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

[外链图片转存中…(img-ddBzS0gh-1715367202901)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-lyq4Vja5-1715367202901)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值