重要筆記 1、加密和解密需要使用同一個(gè)秘鑰;如果密鑰不同,可能會(huì)導(dǎo)致應(yīng)用程序崩潰。 2、私自保存視頻文件,不要使用外部或公共文件目錄;如果使用它,可能會(huì)導(dǎo)致數(shù)據(jù)泄漏。 |
---|
在 Android 應(yīng)用程序中下載和限制視頻文件
介紹
幾個(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ù)。
從 URL 下載視頻
為了下載視頻,我們將使用Fetch庫(kù)。
使用以下依賴項(xiàng)更新您的 build.gradle 文件。
該庫(kù)可讓您下載視頻/pdf/圖像以及更多不同格式的文件。以下是使用 Fetch 庫(kù)下載視頻的代碼片段。
首先,您必須像下面這樣定義獲取配置
val fetchConfiguration: FetchConfiguration = FetchConfiguration.Builder(這個(gè))
.setDownloadConcurrentLimit(1).enableLogging(真)
.enableRetryOnNetworkGain(真)
。建造()
使用Fetch.getInstance 實(shí)例獲取獲取實(shí)例
如下所示準(zhǔn)備請(qǐng)求
之后,您需要像上面提到的那樣設(shè)置請(qǐng)求的優(yōu)先級(jí)
設(shè)置請(qǐng)求的網(wǎng)絡(luò)類型
如圖所示,使用clientKey添加標(biāo)頭
之后,您需要使用此代碼將其放入隊(duì)列
請(qǐng)求?.let {
獲取!!.enqueue(它,
Func { updatedRequest: 請(qǐng)求?-> },
Func { 錯(cuò)誤:錯(cuò)誤?-> })
}
使用 Fetch 偵聽(tīng)器進(jìn)行更多操作
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í)例
由于我們集成了文件加密功能,因此我們需要定義密鑰。要生成密鑰,您可以使用以下代碼片段。
有趣的 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)
最后,你需要使用CipherInputStream
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)解密加密的視頻文件。
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)。
結(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)始探索吧!