欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android 使用腾讯TBS

程序员文章站 2022-03-13 08:09:59
接入SDK接入1.jar包:https://x5.tencent.com/tbs/sdk.html2.Gradle:api ‘com.tencent.tbs.tbssdk:sdk:43903’权限配置

接入

SDK接入

1.jar包:https://x5.tencent.com/tbs/sdk.html
2.Gradle:api ‘com.tencent.tbs.tbssdk:sdk:43903’

权限配置

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

混淆配置

-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**

-keep class com.tencent.smtt.** {
    *;
}

-keep class com.tencent.tbs.** {
    *;
}

异常

当发生异常时需要上报异常信息,可通过com.tencent.smtt.sdk.WebView.getCrashExtraMessage(appContext)获取异常信息

启动优化

TBS内核首次使用和加载时,ART虚拟机会将Dex文件转为Oat,该过程由系统底层触发且耗时较长,很容易引起anr问题,解决方法是使用TBS的 ”dex2oat优化方案“。
1.设置开启优化方案

// 在调用TBS初始化、创建WebView之前进行如下配置 
HashMap map = new HashMap(); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true); 
QbSdk.initTbsSettings(map);

2.增加Service声明

<!--只在TBS内核首次Dex加载时触发并执行dex2oat任务,任务完成后自动结束-->
<service 
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" >
</service>

webview使用

将所有的android.webkit.用的类都换成com.tencent.下对应的类,包括xml里面,也可以使用腾讯提供的工具,只需要将工具放在根目录即可:
shell版本:http://res.imtt.qq.com/TES/checkqbsdk.zip
Windows版本:http://res.imtt.qq.com/TES/TBSSdk_windows.zip

在代码中引入包时不要如下引入,防止出现异常
import android.*;
import android.webkit.*;
import android.webkit.WebStorage.*;
import android.net.*;
import android.net.http.*;

文件使用

支持文件格式:doc、docx、ppt、pptx、xls、xlsx、pdf、txt、epub
支持方式:本地
使用:
1.AndroidMenifest.xml中

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provide_file_paths"/>
        </provider>

2.res/xml/provide_file_paths

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <paths>
        <external-path path="" name="sdcard"/>
    </paths>

</resources>

3.Qbsdk.initX5Environment(final Context context, final PreInitCallback callback)
回调中必须返回true,代表x5 内核初始化完成,然后才能加载文档
4.调用方法

Qbsdk.openFileReader(
    Context context, 
    String filePath, 
    HashMap<String, String> extraParams,
    ValueCallback<String> callback
)

context:只能是 activity 类型的 context
filePath:本地存储路径格式,不支持 file:/// 格式
extraParams:miniqb 的扩展功能,不需要时写null
callback:事件处理回调

关闭打开文件方法:

Qbsdk.closeFileReader(Context context)

完整代码

package com.example.test;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;

import com.tencent.smtt.export.external.TbsCoreSettings;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.ValueCallback;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity implements QbSdk.PreInitCallback , ValueCallback<String> {

    private static final String LOG_TAG = "MainActivity";

    private boolean mbX5IsInit = false;

    private Handler mhandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            initX5();
        }
    };

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] list = new String[1];
        list[0] = "android.permission.WRITE_EXTERNAL_STORAGE";
        MainActivity.this.requestPermissions(list, 105);

        mhandler.sendMessage(new Message());
        findViewById(R.id.tv_test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                open();
            }
        });
    }

    private void initX5(){
        Log.d(LOG_TAG,"开始加载内核");
        QbSdk.initX5Environment(this, this);
    }

    @Override
    public void onCoreInitFinished() {

    }

    @Override
    public void onViewInitFinished(boolean isX5Core) {
        Log.d(LOG_TAG,"内核加载完毕 onViewInitFinished,isX5Core ="+isX5Core);
        mbX5IsInit = isX5Core;
        if (!mbX5IsInit){
            mhandler.sendMessage(new Message());
        }
    }

    @Override
    public void onReceiveValue(String s) {
        Log.d(LOG_TAG,"onReceiveValue,s ="+s);
    }

    private void open(){
        HashMap map = new HashMap();
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
        QbSdk.initTbsSettings(map);
        QbSdk.openFileReader(this, "storage/emulated/0/at/1.pdf", null, this);
    }
}

本文地址:https://blog.csdn.net/qq_37658380/article/details/107209262