<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • pdf查看軟件哪個好(安卓手機pdf閱讀器排行)


    為什么需要在Android應用內打開PDF、Word、Excel等文檔?

    由于公司項目有一部分功能是能觀看新聞,但是這些新聞的內容并不都是一個HTML或者鏈接直接可以使用Android WebView直接打開,而是這些新聞詳情中含有各種類型的文檔都存在比如:PDF、Word、Excel等等文檔。由于之前趕項目的時候,處理方式是直接調用系統瀏覽器下載查看,項目快完結時,公司老大說我們需要將我們的新聞在我們自己的應用內部打開,這樣顯得我們專業,而且友好,讓我們去想個方案,至此需求就出來。

    我相信Android 開發的都是想打人的,為啥IOS直接使用系統WebView就能直接打開所有文檔,而我們就不行。這話說來就要怪Google爸爸了,Google爸爸其實是有方案解決,就是使用Google Service。但是由于國內的網絡原因,所以這種方法只能放棄了。

    我相信這個可能有很多的解決方法,但是我這是只是記錄一下我自己的解決方法,如果還有更好的方法,還希望各位給我指出,感謝。

    先看看我的實現效果圖:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    解決方法


    我這里是使用騰訊的TBS內核,來替換掉Android 原生的WebView。至于為什么使用X5內核呢?理由有幾點:

    騰訊大佬的東西(雖然討論區還是有些BUG,但是不影響大局)

    微信、QQ都是使用的TBS內核

    使用的TBS內核的人多,討論區熱鬧,有很多的解決方案。

    TBS內核優點:

    1. TBS(騰訊瀏覽服務)的優勢

    1) 速度快:相比系統webview的網頁打開速度有30+%的提升;

    2) 省流量:使用云端優化技術使流量節省20+%;

    3) 更安全:安全問題可以在24小時內修復;

    4) 更穩定:經過億級用戶的使用考驗,CRASH率低于0.15%;

    5) 兼容好:無系統內核的碎片化問題,更少的兼容性問題;

    6) 體驗優:支持夜間模式、適屏排版、字體設置等瀏覽增強功能;

    7) 功能全:在Html5、ES6上有更完整支持;

    8) 更強大:集成強大的視頻播放器,支持視頻格式遠多于系統webview;

    9) 視頻和文件格式的支持x5內核多于系統內核

    10) 防劫持是x5內核的一大亮點

    2. 運行環境

    1)手機ROM版本高于或等于2.2版本

    2)手機RAM大于500M,該RAM值通過手機 /proc/meminfo 文件的MemTotal動態獲取

    注:如果不滿足上述條件,SDK會自動切換到系統WebView,SDK使用者不用關心該切換過程。

    3. SDK尺寸指標

    1)SDK提供的JAR包約250K

    TBS內核的文件能力

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    APP在接入文件服務后,即可支持主流9種格式。升級文件服務后,可支持46種文件格式。

    接入TBS


    如果不想看我寫的,可以直接看官網的接入流程。

    1、導入Jar包

    官網下載好Android Studio接入示例,將TBS jar包放入libs文件夾下面如圖:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    申請必要的權限:

    <uses-permission android:name=”android.permission.INTERNET” />

    <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

    <uses-permission android:name=”android.permission.DOWNLOAD_WITHOUT_NOTIFICATION”/>

    <uses-permission android:name=”android.permission.ACCESS_DOWNLOAD_MANAGER”/>

    <uses-permission android:name=”android.permission.WRITE_SETTINGS”/>

    <uses-permission android:name=”android.permission.READ_PHONE_STATE”/>

    2、初始化TBS

    一般TBS的X5內核初始化是放在Application中進行,如圖是我的項目中初始化地方:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    下面是系統WebView的類和tbs內核的類的區別:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    tbs的內核的類名和系統的基本一致,而且使用方法也是一致,這里就不贅述了。

    3、64位手機

    這個是TBS官網的解釋:

    x5內核暫時不提供64位的so文件,在64位手機上需要讓APP以32位模式運行。具體操作如下:

    1.如果使用是Eclipse則需要將所有的.so文件都放置在so加載目錄:lib/armeabi文件夾下(沒有該目錄則新建一個,AP中沒有使用到.so文件則需要拷貝任意一個32位的so文件到該目錄下,如果沒有合適的so可以到“SDK接入示例“,拷貝對應目錄下的liblbs.so文件),lib文件夾下不要有其他以”armeabi“開頭的文件夾。

    2.如果使用的是 Android studio則需要進行兩項配置,

    (1)打開對應module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(如果沒有defaultConfig{}則手動添加)添加如下配置: ndk{abiFilters “armeabi”},如果配置后編譯報錯,那么需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;

    (2)找出build.gradle中配置的so加載目錄
    :jniLibs.srcDir:customerDir,如果沒有該項配置則so加載目錄默認為:src/main/jniLibs,需要將.so文件都放置在so加載目錄的armeabi文件夾下(沒有該目錄則新建一個,AP中沒有使用到.so文件則需要拷貝任意一個32位的so文件到該目錄下,如果沒有合適的so可以到官網http://x5.tencent.com/tbs/sdk.html下載官網“SDK接入示例“,拷貝對應目錄下的liblbs.so文件),so加載目錄下不要有其他以”armeabi“開頭的文件夾。

    我就用我的接入的圖片說明:

    1.添加32位的so庫

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    這個liblbs.so文件可以是任意的32位的so文件,我們一般自己難得去找,或者你有現成的更好,這里我直接拷貝示例里面的:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    2.在 app/build.gradle 文件中對 libs 目錄中 jar 文件的依賴

    dependencies {
     compile fileTree(dir: 'libs', include: ['*.jar'])
    }

    3.**需要注意的是:**TBS 目前只提供 armeabi 類型 CPU 架構的 so 庫。當然,也可以將 so 文件放置于 libs 目錄下,只不過需要在 app/build.gradle 中額外修改 so 文件依賴配置:

    sourceSets {
     main {
     jniLibs.srcDirs = ['libs']
     }
     }

    那么我們要怎么確認是否這個TBS的X5內核已經加載成功了呢?

    如下圖,當你長按選擇復制的時候出現下面的藍色水滴狀就表示tbs的X5內核加載成功:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    4、下載文件到本地

    下載文件到本地,我們就使用系統的http請求來下載文件,假如你開發中用的Okhttp或者其他的網絡框架,直接使用網絡框架下載就好了。代碼如下:

    5、TbsReaderView加載文件

    創建TbsReaderView:

    • /**
    • * 下載文件并使用TBS打開文件 *
    • * @param url 下載的路徑
    • * @param fileName 保存的文件的名字
    • * @param fileType 我們需要打開的文件的類型 word類型 doc excel類型xls pdf類型 pdf等等,這個可以在官網上查
    • * @throws IOException */
    • private void downLoadFile(URL url, String fileName, String fileType) throws IOException {
    • new Thread(new Runnable() {
    • @Overridepublicvoidrun() {
    • try {
    • final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    • //獲取總的文件大小
    • connection.setRequestMethod(“GET”);
    • //試過POST 可能報錯
    • connection.setDoInput(true);
    • connection.setConnectTimeout(10000);
    • connection.setReadTimeout(10000);
    • //實現連接
    • connection.connect();
    • if (connection.getResponseCode() == 200) {
    • //獲取內容長度int contentLength =
      connection.getContentLength();
    • inputStream = connection.getInputStream();
    • File dir = mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
    • file = new File(dir, fileName);
    • if (file.exists()) {
    • file.delete(); }
    • fileOutputStream = new FileOutputStream(file);
    • byte[] bytes = newbyte[1024];
    • int tempLen;
    • long totalReaded = 0;
    • while ((tempLen = inputStream.read(bytes)) != -1) {
    • // bytes[index]= (byte) temp_Len;// index++;
    • totalReaded += tempLen;
    • finalint progress = (int) (totalReaded * 100 / contentLength);
    • mContext.runOnUiThread(() -> binding.progress.setProgress(progress)); fileOutputStream.write(bytes, 0, tempLen);
    • }
    • }
    • } catch (Exception e) {
    • Logger.e(“文件下載異常”);
    • } finally {
    • if (fileOutputStream != null) {
    • try { f
    • ileOutputStream.close();
    • } catch (IOException e) {
    • e.printStackTrace();
    • }
    • }
    • if (inputStream != null) {
    • try {
    • inputStream.close();
    • } catch (IOException e) {
    • e.printStackTrace();
    • }
    • }
    • }
    • }
    • });
    • }

    Activity 中實現 ReaderCallback 接口,并通過 Java 代碼動態創建 TbsReaderView 對象,將其添加到 content view 當中。

    實現ReaderCallback 接口,重寫方法:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    暫不知這個方法有什么用,我也沒使用到,所以未深究。

    可能你會有疑惑,為什么不將 TbsReaderView 放在 layout 布局文件中,而是在代碼中手動 add 進去。經測試,這么做會報錯,提示找不到這個類。然后我們查看 TbsReaderView 源碼,發現只有這么一個構造函數:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    最后一步傳入參數,打開文件即可:

    Android 應用內部打開PDF、Excel、Word文檔你們Get了么?

    說明下這里的fileType是一個字符串類型的,其實就是文件的后綴名,例如Word類型的是“doc” 、 PDF的類型是“pdf”,一般可以通過url來截取到類型。

    總結

    Android 應用中打開文件,上面只是我個人的項目使用的方法,當然還有其他的方法。歡迎大家都去嘗試,其實一般這種按照官網的文檔來做是沒有什么問題的,但是說實話文檔還是有點簡陋,只有自己動手去做才比較清楚。還有點就是告訴大家:tbs的X5內核還是有問題的,并不是說騰訊的都沒問題,可以去tbs的討論區看看都有哪些問題,然后根據這些問題,確定自己的項目是否適合使用。

    原創不易,如果覺得寫得好,關注一下點個贊,是我最大的動力。

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费