MyX5TbsPlusDemo【體驗騰訊瀏覽服務Android SDK (TbsPlus 版)】

版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html

前言

按照官網上的說明:只需接入aar文件和調用一個接口便可完成TBS接入,咱們會經過全屏Activity展現TBS WebView,適用於快速接入TBS且常規使用WebView的開發者。java

按照接入文檔中的說明:tbsplus是在tbs sdk 完整版基礎上提供的開發者一鍵接入的AAR包,開發者只需經過Android Studio接入該AAR後調用一個接口就能夠實現瀏覽網頁的功能,tbsplus內部會封裝實現webview設置工具欄等功能。react

 

本Demo演示tbsplus打開普通網頁tbsplus預覽視頻功能以及演示預覽文件功能在新的activity界面中預覽文件,不是在dialog中預覽文件)。android

其中,tbs預覽文件須要注意一下幾點:git

  • 加載文件核心類是 TbsReaderView,騰訊文檔沒有寫,因此須要查找網上資料。
  • TBS目前只支持加載本地文件。因此遠程文件須要先下載,後用TBS加載文件顯示。
  • 負責加載和顯示文件的界面,離開本界面以後務必須要銷燬,不然再次加載文件沒法加載成功,會一直顯示加載文件進度條。

 

TBSPlus版存在的缺點:github

一、使用TBS打開普通網頁以及視頻的時候,底部始終存在工具欄:web

 

二、TBSPlus預覽視頻,會先在中間區域出現控制器: 瀏覽器

 

三、TBS預覽文件,第一頁右下角始終存在「查找|最近文件」按鈕(滑動後會消失)【共性問題,只要使用TBS預覽文件都會出現】: app

效果圖

代碼分析

接口介紹

TbsPlus是對外接口類:ide

1、public static int openUrl(Context context, String url)

//url  要打開的網址,須要攜帶http,https,file,ftp四個協議頭中的一個,若是沒有攜帶,咱們會自動在url前面加上 http://
public static int openUrl(Context context, String url)

2、public static int openUrl(Context context, String url, eTBSPLUS_SCREENDIR screendir )

//url  要打開的網址,須要攜帶http,https,file,ftp四個協議頭中的一個,若是沒有攜帶,咱們會自動在url前面加上 http://
// screendir    eTBSPLUS_SCREENDIR 枚舉    打開網頁時Activity的屏幕方向
// public static enum eTBSPLUS_SCREENDIR{
        eTBSPLUS_SCREENDIR_SENSOR,/* 橫豎屏 */
        eTBSPLUS_SCREENDIR_PORTRAIT,/* 豎屏 */
        eTBSPLUS_SCREENDIR_LANDSCAPE/* 橫屏 */
    }
public static int openUrl(Context context, String url, eTBSPLUS_SCREENDIR screendir )

使用步驟

1、項目組織結構圖

注意事項:

一、  導入類文件後須要change包名以及從新import R文件路徑

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋

2、導入步驟

一、下載sdk

下載地址:https://x5.tencent.com/tbs/sdk.html

下載的文件解壓後以下:【接入文檔頗有用

二、將arr文件導入項目中

參考《【Android Studio安裝部署系列】十7、Android studio引用第三方庫、jar、so、arr文件

三、實現支持64位手機加載X5

將TbsPlus接入示例文件中的demo項目的jniLibs目錄複製到項目的main目錄下【若是項目的main目錄中已經存在jniLibs文件夾,則只須要把so文件複製到相應armeabi目錄下】

在build.gradle文件中添加如下代碼

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.why.project.myx5tbsplusdemo"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //引用tbsplus ndk{abiFilters "armeabi"}
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//引用tbsplus
repositories{
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //引用tbsplus
    compile(name: 'tbsplus_3.6.0.1248_43611_sharewithdownload_withoutGame_obfs', ext: 'aar')

    //運行時權限
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
    compile 'io.reactivex.rxjava2:rxjava:2.0.2'
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
}

 若是配置後編譯報錯,那麼須要在gradle.properties文件中加上Android.useDeprecatedNdk=true;

 

至此就引用成功了,在須要打開網頁的時機調用TbsPlus的OpenUrl接口便可,咱們內部會建立一個Activity展現網頁。參考MainActivity.java

 

若是想要實現預覽文件功能,那麼還須要進行下面的步驟:

0-一、申請運行時權限,參考《Android6.0運行時權限(基於RxPermission開源庫)

 

將DisplayFileActivity複製到項目中

package com.why.project.myx5tbsplusdemo;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.tbruyelle.rxpermissions2.RxPermissions;
import com.tencent.smtt.sdk.TbsReaderView;

import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;

/**
 * Created by HaiyuKing
 * Used 調用騰訊瀏覽服務預覽文件
 */

public class DisplayFileActivity extends AppCompatActivity{

    private static final String TAG = DisplayFileActivity.class.getSimpleName();

    private TbsReaderView mTbsReaderView;//用於預覽文件5-1

    private String filePath = "";
    private String fileName = "";

    public static void openDispalyFileActivity(Context context,String filePath,String fileName){
        Intent intent = new Intent(context,DisplayFileActivity.class);
        intent.putExtra("filepath",filePath);
        intent.putExtra("filename",fileName);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_displayfile);

        initTbsReaderView();//用於預覽文件5-2

        Intent intent = getIntent();
        filePath = intent.getStringExtra("filepath");
        fileName = intent.getStringExtra("filename");

        onePermission();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mTbsReaderView.onStop();//用於預覽文件5-5
    }

    //初始化TbsReaderView 5-3
    private void initTbsReaderView(){
        mTbsReaderView = new TbsReaderView(DisplayFileActivity.this, new TbsReaderView.ReaderCallback(){ @Override public void onCallBackAction(Integer integer, Object o, Object o1) { //ReaderCallback 接口提供的方法能夠不予處理(目前不知道有什麼用途,可是必定要實現這個接口類)
 } }); RelativeLayout rootRl = (RelativeLayout) findViewById(R.id.root_layout); rootRl.addView(mTbsReaderView, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }
    //預覽文件5-4
    /**
     * filePath :文件路徑。格式爲 android 本地存儲路徑格式,例如:/sdcard/Download/xxx.doc. 不支持 file:///格式。暫不支持在線文件。
     * fileName : 文件的文件名(含後綴)*/
    private void displayFile(String filePath,String fileName) {
        Bundle bundle = new Bundle(); bundle.putString("filePath", filePath); bundle.putString("tempPath", Environment.getExternalStorageDirectory().getPath()); boolean result = mTbsReaderView.preOpen(parseFormat(fileName), false); if (result) { mTbsReaderView.openFile(bundle); }
    }

    private String parseFormat(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    /**只有一個運行時權限申請的狀況*/
    private void onePermission(){
        RxPermissions rxPermissions = new RxPermissions(DisplayFileActivity.this); // where this is an Activity instance
        rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE) //權限名稱,多個權限之間逗號分隔開
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean granted) throws Exception {
                        Log.e(TAG, "{accept}granted=" + granted);//執行順序——1【多個權限的狀況,只有全部的權限均容許的狀況下granted==true】
                        if (granted) { // 在android 6.0以前會默認返回true
                            // 已經獲取權限
                            Toast.makeText(DisplayFileActivity.this, "已經獲取權限", Toast.LENGTH_SHORT).show();
                        } else {
                            // 未獲取權限
                            Toast.makeText(DisplayFileActivity.this, "您沒有受權該權限,請在設置中打開受權", Toast.LENGTH_SHORT).show();
                        }
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e(TAG,"{accept}");//多是受權異常的狀況下的處理
                    }
                }, new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.e(TAG,"{run}");//執行順序——2
                        displayFile(filePath,fileName);
                    }
                });
    }
}

 將activity_displayfile.xml複製到項目中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</RelativeLayout>

在AndroidManifest.xml中聲明DisplayFileActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.myx5tbsplusdemo">

    <!-- ======================TBS的預覽文件功能========================== -->
    <!-- 容許程序讀取外部存儲文件 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!-- 容許程序寫入外部存儲,如SD卡上寫文件 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!-- TBS預覽文件界面 -->
        <activity android:name=".DisplayFileActivity">
        </activity>
    </application>

</manifest>

3、使用方法

MainActivity文件【主要演示tbsplus打開普通網站、預覽視頻功能和打開TBS預覽文件界面(同時傳值)】

package com.why.project.myx5tbsplusdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.tencent.smtt.sdk.QbSdk;

import tbsplus.tbs.tencent.com.tbsplus.TbsPlus;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        QbSdk.initX5Environment(MainActivity.this, null);

        initEvents();
    }

    private void initEvents() {
        findViewById(R.id.btn_openUrl).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String url = "http://www.baidu.com"; TbsPlus.openUrl(MainActivity.this, url, TbsPlus.eTBSPLUS_SCREENDIR.eTBSPLUS_SCREENDIR_SENSOR);
            }
        });

        findViewById(R.id.btn_openfile).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //請求下面的地址會打開第三方瀏覽器軟件,我這邊打開的是QQ瀏覽器(多是默認的瀏覽器)
                /*String url = "http://www.beijing.gov.cn/zhuanti/ggfw/htsfwbxzzt/shxfl/fw/P020150720516332194302.doc";
                TbsPlus.openUrl(MainActivity.this, url, TbsPlus.eTBSPLUS_SCREENDIR.eTBSPLUS_SCREENDIR_SENSOR);*/

                //TBS目前只支持加載本地文件。因此遠程文件須要先下載,後用TBS加載文件顯示。
                //這裏沒有演示下載過程,而是直接把上面的文件下載到手機中【下面的路徑根據實際狀況修改】
                String filePath = "/storage/emulated/0/QQBrowser/文檔/P020150720516332194302.doc"; String fileName = "P020150720516332194302.doc"; DisplayFileActivity.openDispalyFileActivity(MainActivity.this,filePath,fileName);

            }
        });

        findViewById(R.id.btn_openvideo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //直播,點播視頻均可以播放
                String url = "http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8"; TbsPlus.openUrl(MainActivity.this, url, TbsPlus.eTBSPLUS_SCREENDIR.eTBSPLUS_SCREENDIR_SENSOR);
            }
        });
    }


}

混淆配置

參考資料

接入指南

基於騰訊瀏覽服務 TBS 實現應用內打開並瀏覽 Office 文件

Android使用TBS瀏覽器加載pdf,doc等文件

項目demo下載地址

https://github.com/haiyuKing/MyX5TbsPlusDemo

相關文章
相關標籤/搜索