Tencent TBS (下简称TBS)

腾讯浏览服务

What is it?

百度百科解释:

腾讯浏览服务(Tencent Browsing Service,以下简称TBS),由腾讯X5浏览服务升级而来,作为业界首个升级至X5 blink内核,与Android 5.0 版本的Chromium M37一致,解决了Android 多平台兼容性问题。

在我们的手机上如何找到它?微信打开一片公众号的文章,下拉会出现(QQ浏览器X5内核提供技术支持)。QQ/TIM内置浏览器。QQ浏览器,都使用了x5内核。

TIM?如果你还没有用过Tim,可以点击下面的连接进行下载(个人感觉比QQ好用):

https://tim.qq.com/htdocs/vip/share.html?_wv=16777216&_wvSb=1&uid=*St*MzM3MDgxMjY3

Why use it?

  • 让你的app实现基本网页加载(类浏览器功能)
  • 让你的app实现播放视频功能
  • 让你的app实现播放直播流功能

How use it?

  • 第一步:访问TBS官网,下载SDK for Android
  • 第二步:根据集成文档,集成到自己的项目中
  • 第三步:编写自己的代码进行测试。

下载TBS SDK

官网:https://x5.tencent.com/



点击首页的SDK下载,

点击下载完整版,或者点击分享链接:

链接:https://pan.baidu.com/s/1jJujWiE 密码:sxkg

点击下载SDK接入示例-Android Studio,或者点击分享链接:

链接:链接:https://pan.baidu.com/s/1kW0T44v 密码:ca11

SDK集成

  1. 解压SDK压缩包,复制里面的jar包到自己工程里面的libs(tbs_sdk_thirdapp_v3.5.0.1004_43500_sharewithdownload_withoutGame_obfs_20170801_113025)文件夹中
  2. 添加jar包到构建路径。如下图

  3. 查看官方接入文档:https://x5.tencent.com/tbs/guide/sdkInit.html

  4. 添加so文件支持,解压SDK接入示例-Android Studio压缩包,复制jniLibs文件夹,粘贴到自己工程main包下。具体的操作查看:https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/34cf1488-7dc2-41ca-a77f-0014112bcab7



5. 添加权限:在清单文件中添加如下权限


  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  4. <uses-permission android:name="android.permission.INTERNET"/>
  5. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  1. 在项目的Application中初始化x5内核

  1. /**
  2. *初始化X5
  3. */
  4. private void initX5() {
  5. QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
  6. @Override
  7. public void onCoreInitFinished() {
  8. }
  9. @Override
  10. public void onViewInitFinished(boolean b) {
  11. }
  12. });
  13. }
  1. 如果想实现视频播放功能可以在清单文件中配置该Activity
  1. <activity
  2. android:name="com.tencent.smtt.sdk.VideoActivity"
  3. android:alwaysRetainTaskState="true"
  4. android:configChanges="orientation|screenSize|keyboardHidden"
  5. android:exported="false"
  6. android:launchMode="singleTask">
  7. <intent-filter>
  8. <action android:name="com.tencent.smtt.tbs.video.PLAY"/>
  9. <category android:name="android.intent.category.DEFAULT"/>
  10. </intent-filter>
  11. </activity>

编写代码进行测试。

MainActivity.java

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2. private Button btnOpenUrl;
  3. private Button btnOpenMp4;
  4. private Button btnOpenM3u8;
  5. private Button btnOpenRtmp;
  6. private FrameLayout mFl_web_view_layout;
  7. private WebView mWebView;
  8. /**
  9. * 打开的Url
  10. */
  11. private String openUrl = "http://www.wintp.top";
  12. /**
  13. * m3u8视频的地址
  14. */
  15. private String m3u8Url = "http://www.flashls.org/playlists/test_001/stream_1000k_48k_640x360.m3u8";
  16. /**
  17. * m3u8视频的地址
  18. */
  19. private String mp4Url = "http://v.cctv.com/flash/mp4video6/TMS/2011/01/05/cf752b1c12ce452b3040cab2f90bc265_h264818000nero_aac32-1.mp4";
  20. /**
  21. * rtmp视频的地址 香港卫视:rtmp://live.hkstv.hk.lxdns.com/live/hks
  22. */
  23. private String rtmp8Url = "rtmp://live.hkstv.hk.lxdns.com/live/hks";
  24. @Override
  25. public void onClick(View v) {
  26. if (v == btnOpenUrl) {
  27. //加载URL
  28. initWebView();
  29. } else if (v == btnOpenMp4) {
  30. startVideo(mp4Url);
  31. } else if (v == btnOpenM3u8) {
  32. startVideo(m3u8Url);
  33. } else if (v == btnOpenRtmp) {
  34. startVideo(rtmp8Url);
  35. }
  36. }
  37. /**
  38. * 播放视频
  39. *
  40. * @param url
  41. */
  42. public void startVideo(String url) {
  43. //判断当前Tbs播放器是否已经可以使用。
  44. //public static boolean canUseTbsPlayer(Context context)
  45. //直接调用播放接口,传入视频流的url
  46. //public static void openVideo(Context context, String videoUrl)
  47. //extraData对象是根据定制需要传入约定的信息,没有需要可以传如null
  48. //public static void openVideo(Context context, String videoUrl, Bundle extraData)
  49. if ((TbsVideo.canUseTbsPlayer(this))) {
  50. //可以播放视频
  51. TbsVideo.openVideo(this, url);
  52. } else {
  53. Toast.makeText(this, "视频播放器没有准备好", Toast.LENGTH_SHORT).show();
  54. }
  55. }
  56. @Override
  57. protected void onCreate(Bundle savedInstanceState) {
  58. super.onCreate(savedInstanceState);
  59. setContentView(R.layout.activity_main);
  60. //x5 设置键盘
  61. getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
  62. | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
  63. initView();
  64. }
  65. /**
  66. * 初始化View
  67. */
  68. private void initView() {
  69. btnOpenUrl = findViewById(R.id.btn_open_url);
  70. btnOpenMp4 = findViewById(R.id.btn_open_mp4);
  71. btnOpenM3u8 = findViewById(R.id.btn_open_m3u8);
  72. btnOpenRtmp = findViewById(R.id.btn_open_rtmp);
  73. mFl_web_view_layout = findViewById(R.id.fl_web_view_layout);
  74. btnOpenUrl.setOnClickListener(this);
  75. btnOpenMp4.setOnClickListener(this);
  76. btnOpenM3u8.setOnClickListener(this);
  77. btnOpenRtmp.setOnClickListener(this);
  78. }
  79. /**
  80. * 初始化WebView
  81. */
  82. private void initWebView() {
  83. //采用new WebView的方式进行动态的添加WebView
  84. //WebView 的包一定要注意不要导入错了
  85. //com.tencent.smtt.sdk.WebView;
  86. mWebView = new WebView(this);
  87. LinearLayout.LayoutParams layoutParams =
  88. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
  89. LinearLayout.LayoutParams.MATCH_PARENT);
  90. mWebView.setLayoutParams(layoutParams);
  91. mWebView.loadUrl(openUrl);
  92. WebSettings settings = mWebView.getSettings();
  93. mWebView.setWebViewClient(new WebViewClient() {
  94. @Override
  95. public boolean shouldOverrideUrlLoading(WebView webView, String url) {
  96. webView.loadUrl(url);
  97. return true;
  98. }
  99. @Override
  100. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  101. //设定加载开始的操作
  102. }
  103. @Override
  104. public void onPageFinished(WebView view, String url) {
  105. //设定加载结束的操作
  106. }
  107. @Override
  108. public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
  109. switch (errorCode) {
  110. }
  111. }
  112. @Override
  113. public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {//处理https请
  114. //handler.proceed(); //表示等待证书响应
  115. // handler.cancel(); //表示挂起连接,为默认方式
  116. // handler.handleMessage(null); //可做其他处理
  117. }
  118. });
  119. mWebView.setWebChromeClient(new WebChromeClient() {
  120. @Override
  121. public void onProgressChanged(WebView view, int newProgress) {
  122. if (newProgress < 100) {
  123. String progress = newProgress + "%";
  124. } else {
  125. // to do something...
  126. }
  127. }
  128. @Override
  129. public void onReceivedTitle(WebView view, String title) {
  130. }
  131. });
  132. settings.setJavaScriptEnabled(true);
  133. settings.setUseWideViewPort(true); //将图片调整到适合webview的大小
  134. //设置加载图片
  135. settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
  136. settings.setDefaultTextEncodingName("utf-8");// 避免中文乱码
  137. mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
  138. settings.setNeedInitialFocus(false);
  139. settings.setSupportZoom(true);
  140. settings.setLoadWithOverviewMode(true);//适应屏幕
  141. settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
  142. settings.setLoadsImagesAutomatically(true);//自动加载图片
  143. settings.setCacheMode(WebSettings.LOAD_DEFAULT
  144. | WebSettings.LOAD_CACHE_ELSE_NETWORK);
  145. //将WebView添加到底部布局
  146. mFl_web_view_layout.removeAllViews();
  147. mFl_web_view_layout.addView(mWebView);
  148. }
  149. @Override
  150. public void onBackPressed() {
  151. //监听返回键,判断webview是否能够后退,如果能后退,则执行后退功能如不能后退,则关闭该页面
  152. if (mWebView.canGoBack()) {
  153. mWebView.goBack();
  154. } else {
  155. finish();
  156. }
  157. }
  158. @Override
  159. protected void onResume() {
  160. super.onResume();
  161. if (mWebView != null) {
  162. mWebView.onResume();
  163. }
  164. }
  165. @Override
  166. protected void onPause() {
  167. super.onPause();
  168. if (mWebView != null) {
  169. mWebView.onPause();
  170. }
  171. }
  172. @Override
  173. protected void onDestroy() {
  174. //在Activity销毁的时候同时销毁WebView
  175. //如没有此操作,可能会出现,当你在网页上播放一个视频的时候,直接按home键退出应用,视频仍在播放
  176. if (mWebView != null) {
  177. mWebView.destroy();
  178. mFl_web_view_layout.removeView(mWebView);
  179. mWebView = null;
  180. }
  181. super.onDestroy();
  182. }
  183. }

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical">
  7. <Button
  8. android:id="@+id/btn_open_url"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="打开 wintp.top"/>
  12. <Button
  13. android:id="@+id/btn_open_mp4"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="打开 mp4"/>
  17. <Button
  18. android:id="@+id/btn_open_m3u8"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="打开直播流(m3u8)"/>
  22. <Button
  23. android:id="@+id/btn_open_rtmp"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="打开直播流(rtmp)"/>
  27. <FrameLayout
  28. android:id="@+id/fl_web_view_layout"
  29. android:layout_width="match_parent"
  30. android:layout_height="0dp"
  31. android:layout_weight="1"/>
  32. </LinearLayout>

MyApp.java

  1. package top.wintp.mytbsdemo;
  2. import android.app.Activity;
  3. import android.app.Application;
  4. import android.os.Bundle;
  5. import com.tencent.smtt.sdk.QbSdk;
  6. /**
  7. * 作者: pyfysf
  8. * <p>
  9. * qq: 337081267
  10. * <p>
  11. * CSDN: http://blog.csdn.net/pyfysf
  12. * <p>
  13. * 个人博客: http://wintp.top
  14. * <p>
  15. * 时间: 2018/01/2018/1/22 15:42
  16. * <p>
  17. * 邮箱: pyfysf@163.com
  18. */
  19. public class MyApp extends Application {
  20. @Override
  21. public void onCreate() {
  22. super.onCreate();
  23. initX5();
  24. }
  25. /**
  26. * 初始化X5
  27. */
  28. private void initX5() {
  29. QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
  30. @Override
  31. public void onCoreInitFinished() {
  32. }
  33. @Override
  34. public void onViewInitFinished(boolean b) {
  35. }
  36. });
  37. }
  38. }

该项目的github地址:

https://github.com/pyfysf/MyTbsDemo.git

注意:

视频功能:TBS 支持mp4,rmvb,flv,avi等26种视频格式。

本文只举:mp4,m3u8,rtmp三个格式。

TencentTbs腾讯浏览服务 x5内核使用的更多相关文章

  1. 腾讯浏览服务X5内核集成

    腾讯浏览服务X5内核集成https://www.jianshu.com/p/8a7224ff371a TBS 腾讯浏览器服务接入文档https://x5.tencent.com/tbs/guide/s ...

  2. 集成TBS(腾讯浏览服务)x5内核的webView

    由于公司产品需要展示html5页面,一开始我使用的是android自带webview,一些简单的页面没什么问题,但是碰到比较复杂的页面就让人无语了. 1.Android各大厂商都有自己定制的ROM,导 ...

  3. Android使用腾讯浏览服务X5内核

    [前期准备] 腾讯X5 jar包下载地址 [点击打开] 本次完整DEMO源码 [打开Github] [集成步骤] 第一步:下载jar包添加到项目 第二步:添加权限 <uses-permissio ...

  4. MyX5TbsDemo【体验腾讯浏览服务Android SDK (完整版)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 按照官网上的说明:可独立下载x5内核,也可共享使用微信或手Q的x5内核. 本Demo在引用腾讯X5内核的基础上进行了封装.参考< ...

  5. Android应用内实现视频播放--腾讯浏览服务(TBS)

    TBS视频播放 TBS视频播放器可以支持市面上几乎所有的视频格式,包括mp4, flv, avi, 3gp, webm, ts, ogv, m3u8, asf, wmv, rm, rmvb, mov, ...

  6. MyX5TbsPlusDemo【体验腾讯浏览服务Android SDK (TbsPlus 版)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 按照官网上的说明:只需接入aar文件和调用一个接口即可完成TBS接入,我们会通过全屏Activity展示TBS WebView,适用 ...

  7. Android应用内展示office文件--腾讯浏览服务(TBS)

    什么是TBS  依托 X5 内核强大的能力,致力于提供优化移动端浏览体验的整套解决方案(官网介绍).我们可利用其做文件浏览功能,支持多种文件格式,完全可以满足需求.更多介绍请看官网:http://x5 ...

  8. android 腾讯x5内核 浏览器

    1.浏览器内核: 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 浏览器内核历史介绍: 在android 4.4之前,浏览器用的还是webkit 在android 4.4之后,google就抛 ...

  9. 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)

    1.为什么要集成腾讯X5内核? X5内核相对于系统webview,具有下述明显优势: 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使流量节省20 ...

随机推荐

  1. Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

    一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后, ...

  2. NPOI 超简单的导出导入

      首先说说,第一次遇到过匿名导出的那个时候是在我在北京第一家公司,简单的声明一个对象就可以导出,那时候感觉高大上,自己也想研究研究,但是因为头将代码后来加密了根本看不到.好吧,研究了研究放弃了,后来 ...

  3. 用 jQuery.getJSON() 跨域请求 JSON 数据

    $.getJSON()可以理解为特殊形式的$.ajax(),手册里的说明好复杂,这里只记录一下用到的跨域请求. 先说在同一域名下,js发送数据到php,php返回JSON数据: $.getJSON(' ...

  4. Delphi各种从文件里读取内容的方法

    Hi I am having a problem running a function to read a text file the problem seems to be that my anti ...

  5. Spring特点

    1.非侵入式所谓非侵入式是指,Spring框架的API不会在业务逻辑上出现,即业务逻辑是POJO(Plain Old Java Objects).由于业务逻辑中没有Spring的API,所以业务逻辑可 ...

  6. Spark之SparkSql

    -- Spark SQL 以编程方式指定模式 val sqlContext = new org.apache.spark.sql.SQLContext(sc) val employee = sc.te ...

  7. java中的String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  8. Arm架构下VUE环境的安装

    最近因为项目需要在arm环境下搭建vue环境,网上有基于Linux的 教程,路径略有不同,现整理如下 1.安装文件下载 1.下载地址:http://nodejs.cn/download/ 2.选择一个 ...

  9. python算法与数据结构-栈(43)

    一.栈的介绍 栈作为一种数据结构,是一种只能在一端进行插入和删除操作.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读 ...

  10. 【设计模式】行为型06命令模式(Command Pattern)

    命令模式 个人理解:命令模式,本质上是一种多层次的封装. 好处:降低耦合,扩展极其方便. 以下一段文案摘抄自:http://www.runoob.com/design-pattern/command- ...