好吊色综合高清|東京熱無碼大亂交|欧洲尺码日本尺码,在线日韩福利电影,破解软件库资源共享,仙踪林老狼信息网大豆行情网金属

新聞資訊

在 Android 應(yīng)用程序中下載和限制視頻文件

言鼎科技 2023-06-19 516

介紹

幾個(gè)月前,我遇到了一個(gè)客戶需求,他想要構(gòu)建一個(gè)功能來(lái)下載和限制 Android App 中的視頻文件,就像 YouTube、Netflix、Amazon Prime 對(duì)我們所做的那樣。我花了好幾天的時(shí)間才弄清楚如何完成這個(gè)要求,但我最終得到了一個(gè)令人滿意的解決方案。如果您正在尋找此要求或類似的東西,請(qǐng)鉤到最后。

客戶要求

客戶非常清楚該功能的外觀。但是,團(tuán)隊(duì)需要時(shí)間來(lái)理解和總結(jié)需求。

這是要求-

客戶希望從 URL 下載視頻,將其保存到應(yīng)用程序環(huán)境,并僅從該環(huán)境離線播放(不使用互聯(lián)網(wǎng))。此外,他想限制用戶訪問(wèn)應(yīng)用程序環(huán)境之外的視頻文件。

在 Android 應(yīng)用程序中下載和限制視頻文件:我們的方法

經(jīng)過(guò)大量研究,我們總結(jié)了構(gòu)建該功能的最后三個(gè)步驟:如何在 Android 應(yīng)用程序中下載和限制視頻文件

1.從網(wǎng)址下載視頻
2.加密視頻文件
3.播放時(shí)解密視頻文件

我們將一步一步深入每個(gè)步驟,并在我們的存儲(chǔ)庫(kù)中實(shí)施代碼庫(kù)。

在 Android 應(yīng)用程序中下載和限制視頻文件

從 URL 下載視頻

為了下載視頻,我們將使用Fetch庫(kù)。

使用以下依賴項(xiàng)更新您的 build.gradle 文件。

在 Android 應(yīng)用程序中下載和限制視頻文件
實(shí)施“androidx.tonyodev.fetch2:xfetch2:3.1.6”

該庫(kù)可讓您下載視頻/pdf/圖像以及更多不同格式的文件。以下是使用 Fetch 庫(kù)下載視頻的代碼片段。

首先,您必須像下面這樣定義獲取配置

在 Android 應(yīng)用程序中下載和限制視頻文件
val fetchConfiguration: FetchConfiguration = FetchConfiguration.Builder(這個(gè))
 .setDownloadConcurrentLimit(1).enableLogging(真)
 .enableRetryOnNetworkGain(真)
 。建造()

使用Fetch.getInstance 實(shí)例獲取獲取實(shí)例

在 Android 應(yīng)用程序中下載和限制視頻文件
fetch = Fetch.getInstance(fetchConfiguration)	 

如下所示準(zhǔn)備請(qǐng)求

在 Android 應(yīng)用程序中下載和限制視頻文件
val request = videoUrl?.let {
      文件路徑?.let {
         it1 -> 請(qǐng)求(it, it1)
     }
 }  

之后,您需要像上面提到的那樣設(shè)置請(qǐng)求的優(yōu)先級(jí)

在 Android 應(yīng)用程序中下載和限制視頻文件
request?.priority = Priority.HIGH(可以是高,低,正常)    

設(shè)置請(qǐng)求的網(wǎng)絡(luò)類型

在 Android 應(yīng)用程序中下載和限制視頻文件
request?.networkType = NetworkType.ALL(全局關(guān)閉、不按流量計(jì)費(fèi)且僅限 wifi)

如圖所示,使用clientKey添加標(biāo)頭

在 Android 應(yīng)用程序中下載和限制視頻文件
request?.addHeader("clientKey", "*************************") (您可以在 Fetch dashboard 中找到 clientKey)

之后,您需要使用此代碼將其放入隊(duì)列

在 Android 應(yīng)用程序中下載和限制視頻文件
請(qǐng)求?.let {
  獲取!!.enqueue(它,
    Func { updatedRequest: 請(qǐng)求?-> },
    Func { 錯(cuò)誤:錯(cuò)誤?-> })
}

使用 Fetch 偵聽(tīng)器進(jìn)行更多操作

在 Android 應(yīng)用程序中下載和限制視頻文件
val fetchListener: FetchListener = object : FetchListener {
           重寫(xiě)樂(lè)趣 onQueued(
               @NotNull 下載:下載,
               waitingOnNetwork:布爾值
           ) {
               如果(請(qǐng)求?.id == download.id){
               }
           }
           覆蓋樂(lè)趣 onProgress(
               @NotNull 下載:下載,
               etaInMilliSeconds:長(zhǎng),
               downloadedBytesPerSecond:長(zhǎng)
           ){}
           覆蓋樂(lè)趣 onCompleted(@NotNull 下載:下載){
               Log.d("下載狀態(tài)->>", "onCompleted: ")
           }
           覆蓋樂(lè)趣 onPaused(@NotNull 下載:下載){
               Log.d("下載狀態(tài)->>","視頻暫停")
           }
           重寫(xiě)樂(lè)趣 onResumed(@NotNull 下載:下載){
               Log.d("下載狀態(tài)->>","視頻恢復(fù)")
           }
           覆蓋樂(lè)趣 onStarted(
               下載:下載,
               下載塊:列表,
               總塊數(shù):整數(shù)
           ) {
               Log.d("downloadingStatus->>","視頻開(kāi)始下載")
           }
           覆蓋樂(lè)趣 onWaitingNetwork(下載:下載){}
           覆蓋樂(lè)趣 onAdded(下載:下載){}
           覆蓋樂(lè)趣 onCancelled(@NotNull 下載:下載){
               Log.d("plae->>","視頻取消")
           }
           覆蓋樂(lè)趣 onRemoved(@NotNull 下載:下載){
               Log.d("plae->>","視頻已刪除")
           }
           覆蓋樂(lè)趣 onDeleted(@NotNull 下載:下載){
               Log.d("plae->>","video deLeted")
           }
           覆蓋樂(lè)趣 onDownloadBlockUpdated(
               下載:下載,
               下載塊:下載塊,
               總塊數(shù):整數(shù)
           ) {
               Log.d("plae->>","視頻下載塊已更新")
           }
           覆蓋樂(lè)趣 onError(
               下載:下載,
               錯(cuò)誤:錯(cuò)誤,
               可拋:可拋?
           ) {
               Log.d("plae->>","video onError")
           }
       }
  獲取!!.addListener(fetchListener)

繼續(xù)下一步 - 加密我們剛剛下載的視頻文件。

正在尋找熟練的 Android 開(kāi)發(fā)人員來(lái)構(gòu)建可擴(kuò)展和高性能的移動(dòng)應(yīng)用程序?與最好的Android 應(yīng)用程序開(kāi)發(fā)公司
Bacancy 取得聯(lián)系,無(wú)需浪費(fèi)一秒鐘即可聘請(qǐng)熟練的 android 開(kāi)發(fā)人員。

加密視頻文件

下載視頻并將其保存到目錄后,您必須對(duì)該文件進(jìn)行加密。您可以使用 AES/GCM/NoPadding 算法。在這篇博客中,我們將實(shí)現(xiàn)AES 算法。

首先,您需要獲取上述實(shí)例

在 Android 應(yīng)用程序中下載和限制視頻文件
val encipher = Cipher.getInstance("AES")

由于我們集成了文件加密功能,因此我們需要定義密鑰。要生成密鑰,您可以使用以下代碼片段。

在 Android 應(yīng)用程序中下載和限制視頻文件
有趣的 generateKey():SecretKey?{
  // 生成一個(gè) 256 位密鑰
  val outputKeyLength = 256
  val secureRandom = SecureRandom()
 // 不要*不要*種子 secureRandom!從系統(tǒng)熵自動(dòng)播種。
  val keyGenerator = KeyGenerator.getInstance("AES")
  keyGenerator.init(outputKeyLength, secureRandom)
  返回 keyGenerator.generateKey()
}

將secretKey與加密器連接起來(lái)

在 Android 應(yīng)用程序中下載和限制視頻文件
encipher.init(Cipher.ENCRYPT_MODE,generateKey())

最后,你需要使用CipherInputStream

在 Android 應(yīng)用程序中下載和限制視頻文件
val cis = CipherInputStream(fileInputStream, encipher)
 val buffer = ByteArray(1024) // 緩沖區(qū)可以逐行讀取文件以提高速度
       while (cis.read(buffer).also({ read = it }) >= 0) {
            讀?.let { fos.write(buffer, 0, it) }
            fos.flush()
       }
   fos.close()

解密視頻文件

您不會(huì)直接在您的應(yīng)用中播放加密視頻。為此,您必須解密視頻文件。使用下面的代碼片段來(lái)解密加密的視頻文件。

在 Android 應(yīng)用程序中下載和限制視頻文件
val fos = FileOutputStream(decOutFile)val encipher = Cipher.getInstance("AES")val encodedKey: ByteArray = android.util.Base64.decode(
   getFromPrefs(SECRET_KEY, "", ""),
   android.util.Base64.DEFAULT)val originalKey: SecretKey = SecretKeySpec(encodedKey, 0, encodedKey.size, "AES")encipher.init(Cipher.DECRYPT_MODE, originalKey)val cis = CipherInputStream(fileInputStream, encipher)val buffer = ByteArray(1024) // 緩沖區(qū)可以逐行讀取文件以提高速度while (cis.read(buffer).also({ read = it }) >= 0) {
  讀?.let { fos.write(buffer, 0, it) }
     fos.flush()}fos.close()

所以,這是關(guān)于我們?nèi)绾螛?gòu)建一個(gè)功能:如何在 Android 應(yīng)用程序中下載和限制視頻文件。以下是一些需要牢記的重要注意事項(xiàng)。

重要筆記


1、加密和解密需要使用同一個(gè)秘鑰;如果密鑰不同,可能會(huì)導(dǎo)致應(yīng)用程序崩潰。

2、私自保存視頻文件,不要使用外部或公共文件目錄;如果使用它,可能會(huì)導(dǎo)致數(shù)據(jù)泄漏。


結(jié)論

我希望這篇博客能幫助您實(shí)現(xiàn)您的要求:如何在 Android 應(yīng)用程序中下載和限制視頻文件。如果您是 Android 愛(ài)好者,移動(dòng)應(yīng)用程序開(kāi)發(fā)教程頁(yè)面適合您!我們的移動(dòng)應(yīng)用程序開(kāi)發(fā)團(tuán)隊(duì)一直在努力策劃博客,幫助您消除對(duì)知識(shí)的渴望。所以,訪問(wèn)頁(yè)面并開(kāi)始探索吧!

言鼎科技

The End