TBS腾讯浏览服务的SDK接入-Android studio_ch_kexin的博客-程序员宅基地

技术标签: java  移动开发  Android  

 

TBS官网  普通接入参考项目中的 App、BrowserActivity、X5WebView 等类中相关实现。

第一步:下载jar包并添加至项目

第二步:Android studio修改相关配置

  • 打开对应module中的build.gradle添加的
    android{
       defaultConfig{
            ndk{abiFilters "armeabi"}
        }
     }
     
  • 若配置后编译报错,需在gradle.properties加上 Android.useDeprecatedNdk=true
  • src/main/目录下创建jniLibs;在其创建 armeabi目录并加入liblbs.so文件配置图

第三步:AndroidManifest.xml里权限声明

 

<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" />

<!-- 硬件加速对X5视频播放非常重要,建议开启 -->
<uses-permission android:name="android.permission.GET_TASKS"/>

 配置图

 

第四步:Application中对初始化x5内核接口

QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

    @Override
    public void onViewInitFinished(boolean b) {
        //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
        Log.d("app", " onViewInitFinished is " + b);
    }

    @Override
    public void onCoreInitFinished() {
        // TODO Auto-generated method stub
    }
};

//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);

 配置图

第五步:创建X5WebView继承SDK中WebView

声明WebViewClient

 

private WebViewClient client = new WebViewClient() {
    /**
     * 防止加载网页时调起系统浏览器
     */
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
};

 设置WebViewClient

 

 

@SuppressLint("SetJavaScriptEnabled")
public X5WebView(Context arg0, AttributeSet arg1) {
    super(arg0, arg1);
    this.setWebViewClient(client);
    initWebViewSettings();
    this.getView().setClickable(true);
}

 初始化WebViewSettings

private void initWebViewSettings() {
    WebSettings webSetting = this.getSettings();
    webSetting.setJavaScriptEnabled(true);
    webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
    webSetting.setAllowFileAccess(true);
    webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
    webSetting.setSupportZoom(true);
    webSetting.setBuiltInZoomControls(true);
    webSetting.setUseWideViewPort(true);
    webSetting.setSupportMultipleWindows(true);
    webSetting.setAppCacheEnabled(true);
    webSetting.setDomStorageEnabled(true);
    webSetting.setGeolocationEnabled(true);
    webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
    webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
    webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
}

 些WebView中drawChild

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    boolean ret = super.drawChild(canvas, child, drawingTime);
    canvas.save();
    Paint paint = new Paint();
    paint.setColor(0x7fff0000);
    paint.setTextSize(24.f);
    paint.setAntiAlias(true);
    if (getX5WebViewExtension() != null) {
        canvas.drawText(this.getContext().getPackageName() + "-pid:"
                + android.os.Process.myPid(), 10, 50, paint);
        canvas.drawText(
                "X5  Core:" + QbSdk.getTbsVersion(this.getContext()), 10,
                100, paint);
    } else {
        canvas.drawText(this.getContext().getPackageName() + "-pid:"
                + android.os.Process.myPid(), 10, 50, paint);
        canvas.drawText("Sys Core", 10, 100, paint);
    }
    canvas.drawText(Build.MANUFACTURER, 10, 150, paint);
    canvas.drawText(Build.MODEL, 10, 200, paint);
    canvas.restore();
    return ret;
}

 

 

 

第六步:调整cookie的使用

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

可参项目BrowserActivity类中 initWebViewSetting()

 

/**
 * init WebView
 */
private void initWebViewSetting() {
    WebSettings webSetting = mWebView.getSettings();
    webSetting.setAllowFileAccess(true);
    webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
    webSetting.setSupportZoom(true);
    webSetting.setBuiltInZoomControls(true);
    webSetting.setUseWideViewPort(true);
    webSetting.setSupportMultipleWindows(false);
    webSetting.setAppCacheEnabled(true);
    webSetting.setDomStorageEnabled(true);
    webSetting.setJavaScriptEnabled(true);
    webSetting.setGeolocationEnabled(true);
    webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
    webSetting.setAppCachePath(this.getDir("appcache", 0).getPath());
    webSetting.setDatabasePath(this.getDir("databases", 0).getPath());
    webSetting.setGeolocationDatabasePath(this.getDir("geolocation", 0)
            .getPath());
    webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
    long time = System.currentTimeMillis();
    if (mIntentUrl == null) {
        mWebView.loadUrl(mHomeUrl);
    } else {
        mWebView.loadUrl(mIntentUrl.toString());
    }

    // print the time of webView load
    TbsLog.d("time-cost", "cost time: " + (System.currentTimeMillis() - time));

    // manage Cookie
    CookieSyncManager.createInstance(this);
    CookieSyncManager.getInstance().sync();
}

 

 

第七步:兼容视屏播放

1) 享受页面视屏的完整播放体验,需如下声明:

页面的Activity需要声明android:configChanges=”orientation|screenSize|keyboardHidden”

2) 视屏为了避免闪屏问题,需如下声明:

  1. Activity在onCreate时需要设置: getWindow().setFormat(PixelFormat.TRANSLUCENT);(这个对宿主没什么影响,建议声明)
  2. 以下接口禁止(直接或反射)调用,避免视频画面无法显示:

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

 

第八步:避免输入法界面弹出后遮挡输入光标的问题

方法一在AndroidManifest.xml中设置

android:windowSoftInputMode="stateHidden|adjustResize"

 方法二在代码中动态设置

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

 

补充:Tbs视频播放器接入说明

  1. 第一步:AndroidManifest需要如下的注册:
    <!--视频-->
    <activity
        android:name="com.tencent.smtt.sdk.VideoActivity"
        android:alwaysRetainTaskState="true"
        android:configChanges="orientation|screenSize|keyboardHidden"
        android:exported="false"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="com.tencent.smtt.tbs.video.PLAY"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
     
  2. 第二步:通过TbsVideo调用播放视频,如下:
  3. public static boolean canUseTbsPlayer(Context context) 
    //判断当前Tbs播放器是否已经可以使用。
    
    public static void openVideo(Context context, String videoUrl) 
    //直接调用播放接口,传入视频流的url
    
    public static void openVideo(Context context, String videoUrl, Bundle extraData) 
    //extraData对象是根据定制需要传入约定的信息,没有需要可以传如null
    
    //判断当前Tbs播放器是否已经可以使用。
    if (TbsVideo.canUseTbsPlayer(MainActivity.this)) {
    
        //直接调用播放接口,传入视频流的url
        TbsVideo.openVideo(MainActivity.this, "http://192.168.3.108:8080/alert_icon.mp4");
    }
     源码附上

    https://github.com/banwenmang/X5web

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ch_kexin/article/details/84911714

智能推荐

《代码整洁之道》阅读分享_代码整洁之道在线阅读_Alpinist Wang的博客-程序员宅基地

《代码整洁之道》是世界级软件开发大师Martin Folwer的著作,软件开发行业不朽的经典。养成保持代码整洁的好习惯,才能走得更远。_代码整洁之道在线阅读

Linux environment modules_花开彼岸天x的博客-程序员宅基地

前言在 Linux 超算平台上,通常会安装有不同版本的多种编译器和其他软件等,如常用的编译器有 intel 和 gnu,常用的 MPI 并行库包括 intel mpi,openmpi,mpich2 等,而且对于同一软件,还包含不同的版本或采用不同编译设置得到的可执行程序和链接库等。在使用这些程序时,经常需要对环境变量进行修改。并且由于程序编译时会调用不同类型编译器或第三库,这时程序之间还存在着...

Mybatis之分页插件 - PageHelper原理讲解_mybatis pagehelper原理_赫于富的博客-程序员宅基地

错误一:Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type..._mybatis pagehelper原理

matlab傅里叶变换 绘图_matlab傅里叶变换画图_BCIduino脑机接口社区的博客-程序员宅基地

转自:http://blog.sina.com.cn/s/blog_86186c970101tgcm.html假设采样频率Fs,信号频率F,信号长度L,采样点数N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢? 1. 假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是_matlab傅里叶变换画图

Direct2D死机崩溃现象_MoonlightDesigner的博客-程序员宅基地

开发Windows程序的图形库,有很多选择,Cairo,QT等等,但我比较喜欢用Native图形库:GDI,GDI+,DIRECT2D,GDI感觉逐步退出舞台,因为界面美观的和它沾不边;GDI+是一个大坑,蜗牛般的龟速,如果不构想缓冲层,你根本无法用GDI+来写一个界面程序,否则你的程序绘制帧数很难高于30;而Direct2D看似是GDI和GDI+的终结者,但它也有致命之处:Direc

View滑动到底可以用几种方式实现呢?_view直接到底_景高旭的博客-程序员宅基地

在了解View滑动的书记兼我们需要知道View的坐标系,如果坐标都不知道在什么未知那么索然无味的让它动起来又有什么意义呢?如上图我们根据图片也能得到View的宽高。viewWidth= getLegt() - getRight(); View的宽viewHeight = getTop() - getBottom(); View的高1.1..._view直接到底

随便推点

第四周项目2-建立单链表的算法库_安夏啊的博客-程序员宅基地

问题代码:/*copyright (t) 2016,烟台大学计算机学院*All rights reserved.*文件名称:ll.cpp*作者:李玲*完成日期:2016年9月22日*版本号:v1.0*问题描述:用函数实现顺序表的10个基本运算(见下),并用main函数完成调试工作(建立算法库,多文件组织)*输入描述:无*程

遗传算法详解_整数编码遗传算法_冷夏LX的博客-程序员宅基地

遗传算法的手工模拟计算示例为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。本题中,用无符号二进制整数来表示。 _整数编码遗传算法

杂题集萃[6]_weixin_30709635的博客-程序员宅基地

题目描述给出一棵 \(N\) 个节点的树,树上的每个节点都有一个权值 \(A[i]\)。有 \(Q\) 次询问,每次在树上选中两个点 \(u,v\),考虑所有在简单路径 \(u,v\) 上(包括 \(u,v\))的点构成的集合\(S\)。求\[\sum_{w\in S}{A[w]orDist(u,w)}\]其中 \(Dist(u,w)\) 为简单路径 \(u,w\)上的边数,\(...

linux中ulimit命令简单使用_ulimit -fc_langzi989的博客-程序员宅基地

博客搬家,原地址:https://langzi989.github.io/2017/09/09/Linux中ulimit命令简单使用/系统性能是一个受关注的话题,如何通过最简单的设置来实现有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit是我们在处理问题的时候经常使用的一种手段。ulimit是一种linux系统内置的功能。下面将列举ulimit的一些常用关键字和简单用法。u..._ulimit -fc

java中的Path和Files之Files_一颗小白羊的博客-程序员宅基地

java中的Path和Files之FilesFiles 读写文件创建文件和目录复制、移动和删除文件附1 StandardOpenOption 与 newInputStream,newOutputStream,newBufferedWriter,write 结合使用。附2 StandardCopyOption 类的源码:Files 读写文件快速读取文件。byte[] bytes = Fil...

内存与垃圾回收——(三)运行时数据区_垃圾回收机制主要针对运行的数据区妈_Orcas阿晨的博客-程序员宅基地

文章目录3_运行时数据区3.1_运行时数据区内部结构3.2_JVM中的线程3.3_程序计数器(PC寄存器)√3.4_Java虚拟机栈 √虚拟机栈的特点栈中常见异常设置栈的大小`-Xss`3.4.2_栈的存储单位与结构3.5_栈帧3.5.1_栈帧的内部结构3.5.2_局部变量表 ☆(Local Variables)Slot变量槽补充3.5.3_操作数栈 ☆(Operand Stack)3.5.4_栈顶缓存技术(Top-of-Stack Cashing)3.5.5_动态链接(Dynamic Linking)虚方_垃圾回收机制主要针对运行的数据区妈

推荐文章

热门文章

相关标签