重要笔记 1、加密和解密需要使用同一个秘钥;如果密钥不同,可能会导致应用程序崩溃。 2、私自保存视频文件,不要使用外部或公共文件目录;如果使用它,可能会导致数据泄漏。 |
---|
在 Android 应用程序中下载和限制视频文件
介绍
几个月前,我遇到了一个客户需求,他想要构建一个功能来下载和限制 Android App 中的视频文件,就像 YouTube、Netflix、Amazon Prime 对我们所做的那样。我花了好几天的时间才弄清楚如何完成这个要求,但我最终得到了一个令人满意的解决方案。如果您正在寻找此要求或类似的东西,请钩到最后。
客户要求
客户非常清楚该功能的外观。但是,团队需要时间来理解和总结需求。
这是要求-
客户希望从 URL 下载视频,将其保存到应用程序环境,并仅从该环境离线播放(不使用互联网)。此外,他想限制用户访问应用程序环境之外的视频文件。
在 Android 应用程序中下载和限制视频文件:我们的方法
经过大量研究,我们总结了构建该功能的最后三个步骤:如何在 Android 应用程序中下载和限制视频文件。
1.从网址下载视频
2.加密视频文件
3.播放时解密视频文件
我们将一步一步深入每个步骤,并在我们的存储库中实施代码库。
从 URL 下载视频
为了下载视频,我们将使用Fetch库。
使用以下依赖项更新您的 build.gradle 文件。
该库可让您下载视频/pdf/图像以及更多不同格式的文件。以下是使用 Fetch 库下载视频的代码片段。
首先,您必须像下面这样定义获取配置
val fetchConfiguration: FetchConfiguration = FetchConfiguration.Builder(这个)
.setDownloadConcurrentLimit(1).enableLogging(真)
.enableRetryOnNetworkGain(真)
。建造()
使用Fetch.getInstance 实例获取获取实例
如下所示准备请求
之后,您需要像上面提到的那样设置请求的优先级
设置请求的网络类型
如图所示,使用clientKey添加标头
之后,您需要使用此代码将其放入队列
使用 Fetch 侦听器进行更多操作
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 算法。
首先,您需要获取上述实例
由于我们集成了文件加密功能,因此我们需要定义密钥。要生成密钥,您可以使用以下代码片段。
有趣的 generateKey():SecretKey?{
// 生成一个 256 位密钥
val outputKeyLength = 256
val secureRandom = SecureRandom()
// 不要*不要*种子 secureRandom!从系统熵自动播种。
val keyGenerator = KeyGenerator.getInstance("AES")
keyGenerator.init(outputKeyLength, secureRandom)
返回 keyGenerator.generateKey()
}
将secretKey与加密器连接起来
最后,你需要使用CipherInputStream
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()
解密视频文件
您不会直接在您的应用中播放加密视频。为此,您必须解密视频文件。使用下面的代码片段来解密加密的视频文件。
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 应用程序中下载和限制视频文件。以下是一些需要牢记的重要注意事项。
结论
我希望这篇博客能帮助您实现您的要求:如何在 Android 应用程序中下载和限制视频文件。如果您是 Android 爱好者,移动应用程序开发教程页面适合您!我们的移动应用程序开发团队一直在努力策划博客,帮助您消除对知识的渴望。所以,访问页面并开始探索吧!