Android之騰訊TBS文件預覽

文章目錄

  • 前言
  • 一、效果圖
  • 二、實現步驟
    • 1.去官網注冊并創建應用[騰訊官網](https://console.cloud.tencent.com/tbs/client)
    • 2.下載arr文件并引入[騰訊TBS](https://download.csdn.net/download/Android_Cll/91764395)
    • 3.application實例化
    • 4.activity實例化
    • 5.下載網絡文件
    • 6.PreviewActivity預覽
    • 7.preview布局
  • 總結


前言

做Android的各位,是不是覺得移動端去搞這個文件預覽很操蛋,而且還是各種文件預覽,如果只是PDF可以直接搞定,要預覽各種文件怎么辦,不接第三方怎么弄,猝死都弄不了的,相信我,來吧,今天就是為這個問題來的。


一、效果圖

還是老樣子,先來張效果圖穩定軍心。
在這里插入圖片描述

二、實現步驟

1.去官網注冊并創建應用騰訊官網

在這里插入圖片描述

2.下載arr文件并引入騰訊TBS

代碼如下(示例):

//騰訊TBS文件預覽
implementation fileTree(dir: 'libs', include: ['TbsFileSdk_base_arm64_1.0.5.6000094.20250604183426.aar'])

3.application實例化

代碼如下(示例):

//騰訊TBS初始化fun initEngineAsync() {//設置 licenseKeyTbsFileInterfaceImpl.setLicenseKey("你自己的licensekey")val callback: ITbsReaderCallback = object : ITbsReaderCallback {override fun onCallBackAction(actionType: Int, args: Any, result: Any) {println("初始化actionType=$actionType,args=$args,result=$result")// ITbsReader.OPEN_FILEREADER_ASYNC_LOAD_READER_ENTRY_CALLBACK 的值為7002,不是錯誤碼if (ITbsReader.OPEN_FILEREADER_ASYNC_LOAD_READER_ENTRY_CALLBACK === actionType) {val ret = args as Int // 錯誤碼為 actionType == 7002時 args 的值if (ret == 0) {// 初始化成功println("初始化成功了-----")} else {// 初始化失敗println("初始化失敗了-----")}}}}if (!TbsFileInterfaceImpl.isEngineLoaded()) {TbsFileInterfaceImpl.initEngineAsync(this, callback)}}

4.activity實例化

代碼如下(實例化成功才能有后續哦):

//定義變量
private var isInit = false
//實例化
var ret = initEngine(this)if (ret == 0) {println("初始化成功--->界面")isInit = true} else {println("初始化失敗--->界面")}

5.下載網絡文件

//docurl下載文件地址,filename本地存儲路徑,endname文件格式fun download(docUrl: String, fileName: String, endName: String) {DialogUtils.showLoadingDialog(this)val filePath =getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + "/" + fileName // 本地存儲路徑// 下載文件(可以使用 OkHttp、Retrofit 或原生 HttpURLConnection)Thread {try {val url = URL(docUrl)val connection: HttpURLConnection = url.openConnection() as HttpURLConnectionconnection.setRequestMethod("GET")connection.setDoInput(true)connection.connect()val file = File(filePath)if (!file.exists()) {file.createNewFile()}connection.getInputStream().use { `in` ->FileOutputStream(file).use { out ->val buffer = ByteArray(1024)var len: Intwhile ((`in`.read(buffer).also { len = it }) != -1) {out.write(buffer, 0, len)}out.flush()}}// 下載完成后,在主線程打開文件runOnUiThread {openExternalFilesDirDocument(filePath, endName)DialogUtils.hideLoadingDialog()}} catch (e: Exception) {e.printStackTrace()runOnUiThread {ToastUtils.showToast("下載失敗")}}}.start()}//打開預覽private fun openExternalFilesDirDocument(filePath: String, extName: String) {if (isInit) {if (TbsFileInterfaceImpl.canOpenFileExt(extName)) {startActivity(Intent(this, PreviewActivity::class.java).putExtra("filePath",filePath).putExtra("fileExt", extName).putExtra("url", zhlist[0]))finish()} else {ToastUtils.showToast("此類型文檔暫不支持打開")// tbs 不支持打開的類型}} else {Toast.makeText(applicationContext,"Engine未初始化成功,無法打開文件",Toast.LENGTH_SHORT).show()}}

6.PreviewActivity預覽

class PreviewActivity : BaseActivity() {private lateinit var mFlRoot: FrameLayoutprivate lateinit var mRl: RelativeLayoutprivate var isDestroyed = falseprivate lateinit var imag_fh: ImageViewprivate lateinit var relaitve_xyb: RelativeLayoutoverride fun getContentViewId(): Int {return R.layout.preview}override fun initView(savedInstanceState: Bundle?) {mFlRoot = findViewById(R.id.content)mRl = findViewById(R.id.reader_top)imag_fh = findViewById(R.id.imag_fh)relaitve_xyb = findViewById(R.id.relaitve_xyb)imag_fh.setOnClickListener(this)relaitve_xyb.setOnClickListener(this)val filePath = intent.getStringExtra("filePath").toString()val fileExt = intent.getStringExtra("fileExt").toString()openFile(filePath, fileExt)}override fun onClick(v: View?) {when (v?.id) {R.id.imag_fh -> finish()//下載R.id.relaitve_xyb -> {downloadFile(this, intent.getStringExtra("url").toString(), "下載文檔")}}}fun downloadFile(context: Context, url: String?, fileName: String?) {val downloadManager = context.getSystemService(DOWNLOAD_SERVICE) as DownloadManagerval uri = Uri.parse(url)val request = DownloadManager.Request(uri)// 設置通知欄提示(下載中、完成)request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)// 設置保存路徑(Android 10+ 需使用 MediaStore API 或保存到 Downloads 目錄)request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)// 發起下載downloadManager.enqueue(request)ToastUtils.showToast("已開始下載,請注意導航欄下載進度")}fun openFile(filePath: String, fileExt: String) {//設置回調val callback =ITbsReaderCallback { actionType, args, result ->println("actionType=$actionType,args=$args,result=$result")if (ITbsReader.OPEN_FILEREADER_STATUS_UI_CALLBACK == actionType) {if (args is Bundle) {val id = (args as Bundle).getInt("typeId")if (ITbsReader.TBS_READER_TYPE_STATUS_UI_SHUTDOWN == id) {finish() // 加密文檔彈框取消需關閉 activity}}}}//設置參數val param = Bundle()param.putString("filePath", filePath)param.putString("fileExt", fileExt) // 文件后綴名,如文件名為 test.pdf,則只需要傳入"pdf"param.putString("tempPath", getExternalFilesDir("temp")!!.absolutePath)//調用openFileReader打開文件mFlRoot.post {val height = mFlRoot.height// 自定義 layout 模式必須設置這個值,否則可能導致文檔內容顯示不全param.putInt("set_content_view_height", height)val ret = TbsFileInterfaceImpl.getInstance().openFileReader(this@PreviewActivity, param, callback, mFlRoot)}}// 銷毀資源使用 onpause + ondestroy 的方式。避免 onDestroy 延遲回調private fun destroy() {if (isDestroyed) {return}// 回收資源mFlRoot.removeAllViews() //移除內容顯示區域 layoutTbsFileInterfaceImpl.getInstance().closeFileReader() //關閉 fileReaderisDestroyed = true}override fun onPause() {super.onPause()if (isFinishing) {destroy()}}public override fun onDestroy() {super.onDestroy()destroy()}//橫豎屏切換override fun onConfigurationChanged(@NonNull newConfig: Configuration) {super.onConfigurationChanged(newConfig)mFlRoot.viewTreeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener {override fun onGlobalLayout() {mFlRoot.viewTreeObserver.removeOnGlobalLayoutListener(this)val w = mFlRoot.widthval h = mFlRoot.heightTbsFileInterfaceImpl.getInstance().onSizeChanged(w, h)}})}
}

7.preview布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/backColor"android:orientation="vertical"><FrameLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_below="@+id/reader_top"android:layout_height="match_parent"/><RelativeLayoutandroid:id="@+id/relaitve_xyb"android:layout_width="240dp"android:layout_height="48dp"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="10dp"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitXY"android:src="@mipmap/scmbback" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="下載"android:textColor="#ffffff"android:textSize="16dp" /></RelativeLayout>
</RelativeLayout>

總結

到此結束就解決了Android文件預覽問題,如果有疑問隨時評論區見。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920360.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920360.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于微信小程序的化妝品成分查詢系統源碼

源碼題目&#xff1a;基于微信小程序的化妝品成分查詢系統源碼?? 文末聯系獲取&#xff08;含源碼、技術文檔&#xff09;博主簡介&#xff1a;10年高級軟件工程師、JAVA技術指導員、Python講師、文章撰寫修改專家、Springboot高級&#xff0c;歡迎高校老師、同行交流合作。畢…

STM32 啟動執行邏輯與代碼燒入方法詳解:從底層原理到實操落地

STM32 啟動執行邏輯與代碼燒入方法詳解&#xff1a;從底層原理到實操落地背景概要STM32啟動和執行的核心邏輯鏈條代碼燒入到STM32的途徑方法結束語背景概要 在學習STM32時候我們知道代碼需要通過一些下載器&#xff08;如ST-Link、J-Link&#xff09;或者串口下載燒入到STM32芯…

Go對接印度股票數據源指南:使用StockTV API

一、StockTV API簡介 StockTV提供全球200國家的實時金融數據&#xff0c;覆蓋股票、外匯、期貨和加密貨幣市場。針對印度市場&#xff08;國家ID14&#xff09;&#xff0c;其主要優勢包括&#xff1a; 毫秒級低延遲響應7x24小時穩定服務日均處理億級數據免費技術支持 官方資源…

ESP8266:Arduino學習

ESP8266一&#xff1a;環境搭建使用Ardino框架&#xff0c;在官網下載&#xff0c;下載離線的支持包二&#xff1a;實現簡單的項目1. 點燈{pinMode(LED_PIN, OUTPUT); // 設置引腳為輸出模式digitalWrite(LED_PIN, HIGH); // 點亮 LED}I/O引腳的三種模式分別為&#xff1a;INPU…

青少年軟件編程(python六級)等級考試試卷-客觀題(2023年3月)

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 六級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程&#xff08;python六級&#xff09;等級考試試卷-客觀題&#xff08;2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。讓我幫您說明配置步驟&#xff1a; MongoDB 配置 啟動 MongoDB 容器后&#xff0c;進入容器創建數據庫&#xff1a; # 進入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 創建 product 數據庫 use product# 創建集合…

模擬電路中什么時候適合使用電流傳遞信號,什么時候合適使用電壓傳遞信號

一、應用 1.實際應用中&#xff0c;需要進行權衡&#xff0c;比如抗干擾能力&#xff0c;傳輸距離&#xff0c;功耗 2.電壓信號比較容易受到干擾&#xff0c;對噪聲比較敏感&#xff0c;有噪聲容限一說 3.電流信號對噪聲不敏感 4.電源電壓下降的穩定性或者長距離傳輸中的損耗問…

Flink2.0學習筆記:使用HikariCP 自定義sink實現數據庫連接池化

stevensu1/EC0823: Flink2.0學習筆記&#xff1a;使用HikariCP 自定義sink實現數據庫連接池化 在 Flink 流處理應用中使用 HikariCP 實現數據庫連接池化&#xff0c;對于寫入關系型數據庫&#xff08;如 MySQL、PostgreSQL&#xff09;的 自定義 Sink 來說&#xff0c;不僅是推…

Ubuntu安裝及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github網站上點擊頭像選擇settings來查看 git config --global user

將C++資源管理測試框架整合到GitLab CI/CD的完整實踐指南

將C資源管理測試框架整合到GitLab CI/CD的完整實踐指南 摘要 本文深入探討了如何將先進的C資源管理測試框架無縫集成到GitLab CI/CD流水線中&#xff0c;實現自動化資源監控、性能回歸檢測和高質量測試。通過實際案例和最佳實踐&#xff0c;展示了如何構建一個能夠精確控制CPU親…

Web漏洞

一、Sql注入 sql注入漏洞的成因是由于后端數據庫查詢語句沒有做過濾導致了前端輸入字符串可以直接拼接到語句而獲取數據庫信息。 1.類型 數字型和字符型 區分&#xff1a;數字型可以進行加減運算&#xff0c;id11會獲取id2的信息&#xff0c;而字符型只會獲取1的數據 2.方…

Java中使用Spring Boot+Ollama構建本地對話機器人

目錄結構Ollama是什么安裝 Ollama下載大模型運行模型Java和IDEA版本創建一個springboot項目創建一個簡單的對話接口啟動spring boot流式對話輸出用原生 HTML 打造可交互前端接入 OpenAI、DeepSeek 等云模型&#xff08;可選&#xff09;原文地址傳送門 我是想做一個大模型本地部…

學習設計模式《二十四》——訪問者模式

一、基礎概念 訪問者模式的本質是【預留后路&#xff0c;回調實現】。仔細思考訪問者模式&#xff0c;它的實現主要是通過預先定義好調用的通路&#xff0c;在被訪問的對象上定義accept方法&#xff0c;在訪問者的對象上定義visit方法&#xff1b;然后在調用真正發生的時候&…

Rust 符號體系全解析:分類、應用與設計意圖

Rust 的符號體系是其語法規則、內存安全與類型安全設計的核心載體。每個符號不僅承擔特定功能&#xff0c;更隱含 Rust 對 “安全” 與 “表達力” 的平衡邏輯。本文按功能維度&#xff0c;系統梳理 Rust 中所有常用符號&#xff0c;結合代碼示例與設計背景&#xff0c;提供全面…

神經網絡|(十六)概率論基礎知識-伽馬函數·上

【1】引言 前序學習進程中&#xff0c;對經典的二項分布和正態分布已經有一定的掌握。 今天為學習一種稍顯復雜的分布提前布局一下&#xff0c;學習伽馬函數。 【2】伽馬函數 伽馬函數有兩種經典寫法&#xff0c;一種是積分形式&#xff0c;另一種是無窮乘積形式。 【2.1】…

安全向量模板類SiVector

實現一個安全向量模板類 SiVector&#xff0c;其設計目標是&#xff1a;在保持 std::vector 易用性的基礎上&#xff0c;增強越界訪問的安全性&#xff08;避免崩潰&#xff09;&#xff0c;同時兼容 std::vector 的核心接口和使用習慣。支持嵌套使用&#xff08;如 SiVector&l…

Cloudflare 推出 GenAI 安全工具,守護企業數據

8 月 26 日,Cloudflare 為其企業平臺 Cloudflare One 推出了新的安全功能,幫助企業安全地采用 ChatGPT、Claude 和 Gemini 等生成式 AI 工具。該工具構建為云訪問安全代理 (CASB),通過 API 集成來監控和保護這些 AI 服務,無需安裝設備。 隨著企業對 GenAI 的使用激增——C…

Mac測試端口連接的幾種方式

在 macOS 上測試端口是否開放&#xff0c;可通過以下三種常用方法實現&#xff08;推薦優先使用系統自帶的 nc 命令&#xff0c;簡單高效&#xff09;&#xff1a;方法 1&#xff1a;用系統自帶 nc&#xff08;netcat&#xff09;測試&#xff08;最推薦&#xff09;nc 是 macO…

用PyTorch實現多類圖像分類:從原理到實際操作

引言 圖像分類作為計算機視覺的基石&#xff0c;已深度滲透到我們生活的方方面面——從醫療影像中早期腫瘤的識別、自動駕駛汽車對道路元素的實時檢測&#xff0c;到衛星圖像的地形分析與零售行業的商品識別&#xff0c;其核心都是讓機器學會"看懂"世界并做出分類決…

window安裝python環境

1、確認操作系統類型和位數&#xff0c;明確下載安裝包的版本&#xff0c;示例為&#xff1a;windows&#xff0c;64位環境。 2、登錄python官網下載exe安裝包&#xff0c;下載網址&#xff1a;Download Python | Python.org 找到想要的對應python版本&#xff0c;本次示例下…