新闻资讯

在 Android 应用程序中下载和限制视频文件

言鼎科技 2023-06-19 515

介绍

几个月前,我遇到了一个客户需求,他想要构建一个功能来下载和限制 Android App 中的视频文件,就像 YouTube、Netflix、Amazon Prime 对我们所做的那样。我花了好几天的时间才弄清楚如何完成这个要求,但我最终得到了一个令人满意的解决方案。如果您正在寻找此要求或类似的东西,请钩到最后。

客户要求

客户非常清楚该功能的外观。但是,团队需要时间来理解和总结需求。

这是要求-

客户希望从 URL 下载视频,将其保存到应用程序环境,并仅从该环境离线播放(不使用互联网)。此外,他想限制用户访问应用程序环境之外的视频文件。

在 Android 应用程序中下载和限制视频文件:我们的方法

经过大量研究,我们总结了构建该功能的最后三个步骤:如何在 Android 应用程序中下载和限制视频文件

1.从网址下载视频
2.加密视频文件
3.播放时解密视频文件

我们将一步一步深入每个步骤,并在我们的存储库中实施代码库。

在 Android 应用程序中下载和限制视频文件

从 URL 下载视频

为了下载视频,我们将使用Fetch库。

使用以下依赖项更新您的 build.gradle 文件。

在 Android 应用程序中下载和限制视频文件
实施“androidx.tonyodev.fetch2:xfetch2:3.1.6”

该库可让您下载视频/pdf/图像以及更多不同格式的文件。以下是使用 Fetch 库下载视频的代码片段。

首先,您必须像下面这样定义获取配置

在 Android 应用程序中下载和限制视频文件
val fetchConfiguration: FetchConfiguration = FetchConfiguration.Builder(这个)
 .setDownloadConcurrentLimit(1).enableLogging(真)
 .enableRetryOnNetworkGain(真)
 。建造()

使用Fetch.getInstance 实例获取获取实例

在 Android 应用程序中下载和限制视频文件
fetch = Fetch.getInstance(fetchConfiguration)	 

如下所示准备请求

在 Android 应用程序中下载和限制视频文件
val request = videoUrl?.let {
      文件路径?.let {
         it1 -> 请求(it, it1)
     }
 }  

之后,您需要像上面提到的那样设置请求的优先级

在 Android 应用程序中下载和限制视频文件
request?.priority = Priority.HIGH(可以是高,低,正常)    

设置请求的网络类型

在 Android 应用程序中下载和限制视频文件
request?.networkType = NetworkType.ALL(全局关闭、不按流量计费且仅限 wifi)

如图所示,使用clientKey添加标头

在 Android 应用程序中下载和限制视频文件
request?.addHeader("clientKey", "*************************") (您可以在 Fetch dashboard 中找到 clientKey)

之后,您需要使用此代码将其放入队列

在 Android 应用程序中下载和限制视频文件
请求?.let {
  获取!!.enqueue(它,
    Func { updatedRequest: 请求?-> },
    Func { 错误:错误?-> })
}

使用 Fetch 侦听器进行更多操作

在 Android 应用程序中下载和限制视频文件
val fetchListener: FetchListener = object : FetchListener {
           重写乐趣 onQueued(
               @NotNull 下载:下载,
               waitingOnNetwork:布尔值
           ) {
               如果(请求?.id == download.id){
               }
           }
           覆盖乐趣 onProgress(
               @NotNull 下载:下载,
               etaInMilliSeconds:长,
               downloadedBytesPerSecond:长
           ){}
           覆盖乐趣 onCompleted(@NotNull 下载:下载){
               Log.d("下载状态->>", "onCompleted: ")
           }
           覆盖乐趣 onPaused(@NotNull 下载:下载){
               Log.d("下载状态->>","视频暂停")
           }
           重写乐趣 onResumed(@NotNull 下载:下载){
               Log.d("下载状态->>","视频恢复")
           }
           覆盖乐趣 onStarted(
               下载:下载,
               下载块:列表,
               总块数:整数
           ) {
               Log.d("downloadingStatus->>","视频开始下载")
           }
           覆盖乐趣 onWaitingNetwork(下载:下载){}
           覆盖乐趣 onAdded(下载:下载){}
           覆盖乐趣 onCancelled(@NotNull 下载:下载){
               Log.d("plae->>","视频取消")
           }
           覆盖乐趣 onRemoved(@NotNull 下载:下载){
               Log.d("plae->>","视频已删除")
           }
           覆盖乐趣 onDeleted(@NotNull 下载:下载){
               Log.d("plae->>","video deLeted")
           }
           覆盖乐趣 onDownloadBlockUpdated(
               下载:下载,
               下载块:下载块,
               总块数:整数
           ) {
               Log.d("plae->>","视频下载块已更新")
           }
           覆盖乐趣 onError(
               下载:下载,
               错误:错误,
               可抛:可抛?
           ) {
               Log.d("plae->>","video onError")
           }
       }
  获取!!.addListener(fetchListener)

继续下一步 - 加密我们刚刚下载的视频文件。

正在寻找熟练的 Android 开发人员来构建可扩展和高性能的移动应用程序?与最好的Android 应用程序开发公司
Bacancy 取得联系,无需浪费一秒钟即可聘请熟练的 android 开发人员。

加密视频文件

下载视频并将其保存到目录后,您必须对该文件进行加密。您可以使用 AES/GCM/NoPadding 算法。在这篇博客中,我们将实现AES 算法

首先,您需要获取上述实例

在 Android 应用程序中下载和限制视频文件
val encipher = Cipher.getInstance("AES")

由于我们集成了文件加密功能,因此我们需要定义密钥。要生成密钥,您可以使用以下代码片段。

在 Android 应用程序中下载和限制视频文件
有趣的 generateKey():SecretKey?{
  // 生成一个 256 位密钥
  val outputKeyLength = 256
  val secureRandom = SecureRandom()
 // 不要*不要*种子 secureRandom!从系统熵自动播种。
  val keyGenerator = KeyGenerator.getInstance("AES")
  keyGenerator.init(outputKeyLength, secureRandom)
  返回 keyGenerator.generateKey()
}

将secretKey与加密器连接起来

在 Android 应用程序中下载和限制视频文件
encipher.init(Cipher.ENCRYPT_MODE,generateKey())

最后,你需要使用CipherInputStream

在 Android 应用程序中下载和限制视频文件
val cis = CipherInputStream(fileInputStream, encipher)
 val buffer = ByteArray(1024) // 缓冲区可以逐行读取文件以提高速度
       while (cis.read(buffer).also({ read = it }) >= 0) {
            读?.let { fos.write(buffer, 0, it) }
            fos.flush()
       }
   fos.close()

解密视频文件

您不会直接在您的应用中播放加密视频。为此,您必须解密视频文件。使用下面的代码片段来解密加密的视频文件。

在 Android 应用程序中下载和限制视频文件
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) // 缓冲区可以逐行读取文件以提高速度while (cis.read(buffer).also({ read = it }) >= 0) {
  读?.let { fos.write(buffer, 0, it) }
     fos.flush()}fos.close()

所以,这是关于我们如何构建一个功能:如何在 Android 应用程序中下载和限制视频文件。以下是一些需要牢记的重要注意事项。

重要笔记


1、加密和解密需要使用同一个秘钥;如果密钥不同,可能会导致应用程序崩溃。

2、私自保存视频文件,不要使用外部或公共文件目录;如果使用它,可能会导致数据泄漏。


结论

我希望这篇博客能帮助您实现您的要求:如何在 Android 应用程序中下载和限制视频文件。如果您是 Android 爱好者,移动应用程序开发教程页面适合您!我们的移动应用程序开发团队一直在努力策划博客,帮助您消除对知识的渴望。所以,访问页面并开始探索吧!

言鼎科技

The End