1. 程式人生 > >Android實現線上預覽office文件(Word,Pdf,excel,PPT.txt等格式)

Android實現線上預覽office文件(Word,Pdf,excel,PPT.txt等格式)

1.概述

我們都知道,Android原生並沒有提供瀏覽office文件格式的相關Api,在安卓端想要實現線上預覽office文件的功能顯然很是複雜,我們手機安裝QQ瀏覽器時,在手機開啟office文件時會提示如圖,
外掛載入

這就是這篇文章的主角–騰訊X5核心(TBS)

2,什麼是TBS

騰訊瀏覽服務(TBS,Tencent Browsing Service)整合騰訊底層瀏覽技術和騰訊平臺資源及能力,提供整體瀏覽服務解決方案。騰訊瀏覽服務面向應用開發商和廣大開發者,提供瀏覽增強,內容框架,廣告體系,H5遊戲分發,大資料等服務,能夠幫助應用開發商大幅改善應用體驗,有效提升開發,運營,商業化的效率。

我們主要介紹的是他的檔案開啟能力
目前支援42種檔案格式,包括20種文件、12種音樂、6種圖片和4種壓縮包。幫助應用實現應用內文件瀏覽,無需跳轉呼叫其他應用。
詳細介紹見TBS官方網站

3.載入txt格式的效果圖

注意載入的過程,是先載入支援txt格式的外掛,然後把txt文件加載出來的

載入txt格式的效果圖

4.TBS的使用預覽office檔案

詳細的使用見官方技術文件
技術文件中並沒有提供瀏覽檔案相關的資訊
核心類就一個 TbsReaderView 繼承自FrameLayout

由於使用起來比較簡單,我就直接貼程式碼了,請看註釋

佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:onClick="onClick" android:layout_width
="match_parent" android:layout_height="50dp" android:background="@color/colorAccent" android:text="請選擇檔案開啟"/>
<FrameLayout android:id="@+id/fl" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> </LinearLayout>

java程式碼實現

package com.example.x5tbsdemo;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.FrameLayout;

import com.silang.superfileview.R;
import com.tencent.smtt.sdk.TbsReaderView;

import java.io.File;


public class Main extends Activity {

    private static final int CHOOSE_REQUEST_CODE = 1000;
    private FrameLayout frameLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        frameLayout = (FrameLayout) findViewById(R.id.fl);
    }

    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.button:
                chooseFile();
                break;
        }
    }

    //選擇檔案
    private void chooseFile() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        Intent chooser = Intent.createChooser(intent, "請選擇要代開的檔案");
        startActivityForResult(chooser, CHOOSE_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) {
            if (resultCode == RESULT_OK) {
                switch (requestCode) {
                    case CHOOSE_REQUEST_CODE:
                        Uri uri = data.getData();
                        String path = getPathFromUri(this, uri);
                        openFile(path);
                        break;
                }
            }
        }
    }

    /**
     * 開啟檔案
     */
    private void openFile(String path) {
        TbsReaderView readerView = new TbsReaderView(this, new TbsReaderView.ReaderCallback() {
            @Override
            public void onCallBackAction(Integer integer, Object o, Object o1) {

            }
        });
        //通過bundle把檔案傳給x5,開啟的事情交由x5處理
        Bundle bundle = new Bundle();
        //傳遞檔案路徑
        bundle.putString("filePath", path);
        //載入外掛儲存的路徑
        bundle.putString("tempPath", Environment.getExternalStorageDirectory() + File.separator + "temp");
        //載入檔案前的初始化工作,載入支援不同格式的外掛
        boolean b = readerView.preOpen(getFileType(path), false);
        if (b) {
            readerView.openFile(bundle);
        }
        frameLayout.addView(readerView);
    }

    /***
     * 獲取檔案型別
     *
     * @param path 檔案路徑
     * @return 檔案的格式
     */
    private String getFileType(String path) {
        String str = "";

        if (TextUtils.isEmpty(path)) {
            return str;
        }
        int i = path.lastIndexOf('.');
        if (i <= -1) {
            return str;
        }
        str = path.substring(i + 1);
        return str;
    }

    /**
     * @param context
     * @param uri     檔案的uri
     * @return 檔案的路徑
     */
    public String getPathFromUri(final Context context, Uri uri) {
        // 選擇的圖片路徑
        String selectPath = null;

        final String scheme = uri.getScheme();
        if (uri != null && scheme != null) {
            if (scheme.equals(ContentResolver.SCHEME_CONTENT)) {
                // content://開頭的uri
                Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
                if (cursor != null && cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    // 取出檔案路徑
                    selectPath = cursor.getString(columnIndex);

                    // Android 4.1 更改了SD的目錄,sdcard對映到/storage/sdcard0
                    if (!selectPath.startsWith("/storage") && !selectPath.startsWith("/mnt")) {
                        // 檢查是否有"/mnt"字首
                        selectPath = "/mnt" + selectPath;
                    }
                    //關閉遊標
                    cursor.close();
                }
            } else if (scheme.equals(ContentResolver.SCHEME_FILE)) {// file:///開頭的uri
                // 替換file://
                selectPath = uri.toString().replace("file://", "");
                int index = selectPath.indexOf("/sdcard");
                selectPath = index == -1 ? selectPath : selectPath.substring(index);
                if (!selectPath.startsWith("/mnt")) {
                    // 加上"/mnt"頭
                    selectPath = "/mnt" + selectPath;
                }
            }
        }
        return selectPath;
    }
}

清單檔案要新增許可權

 <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission   android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Note: Tbs不支援載入網路的檔案,需要先把檔案下載到本地,然後再加載出來