当前位置: 首页 > wzjs >正文

平面设计素材免费网站有哪些宿松网站建设公司

平面设计素材免费网站有哪些,宿松网站建设公司,网站搜索出来有图片,域名备案需要网站吗以下是一个针对 Android 高版本的 DownloadManager 封装工具类,支持 断点续传 和 自动安装 APK 功能。该工具类兼容 Android 10 及以上版本的文件存储策略,并适配了 FileProvider 和未知来源应用安装权限。 工具类:DownloadUtils import and…

以下是一个针对 Android 高版本的 DownloadManager 封装工具类,支持 断点续传自动安装 APK 功能。该工具类兼容 Android 10 及以上版本的文件存储策略,并适配了 FileProvider 和未知来源应用安装权限。


工具类:DownloadUtils

import android.app.DownloadManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.core.content.FileProvider
import java.io.Fileclass DownloadUtils private constructor(context: Context) {companion object {private const val TAG = "DownloadUtils"private var instance: DownloadUtils? = null/*** 获取单例实例*/fun getInstance(context: Context): DownloadUtils {return instance ?: synchronized(this) {instance ?: DownloadUtils(context.applicationContext).also { instance = it }}}}private val context: Context = context.applicationContextprivate val downloadManager: DownloadManager =context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManagerprivate var downloadId: Long = -1private var progressListener: DownloadProgressListener? = nullprivate var downloadObserver: DownloadObserver? = null/*** 下载文件** @param url 文件下载地址* @param fileName 保存的文件名* @param listener 下载进度监听器*/fun downloadFile(url: String, fileName: String, listener: DownloadProgressListener) {this.progressListener = listener// 创建下载请求val request = DownloadManager.Request(Uri.parse(url)).apply {setTitle("文件下载")setDescription("正在下载文件...")setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)// 设置下载路径if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// Android 10 及以上版本,使用应用专属目录setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, fileName)} else {// Android 10 以下版本,使用公共下载目录setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)}// 支持断点续传setAllowedOverMetered(true) // 允许使用移动网络setAllowedOverRoaming(true) // 允许漫游时下载}// 开始下载downloadId = downloadManager.enqueue(request)// 注册下载完成监听context.registerReceiver(downloadCompleteReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))// 注册下载进度监听if (progressListener != null) {downloadObserver = DownloadObserver(Handler(Looper.getMainLooper()), downloadId)context.contentResolver.registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, downloadObserver!!)}}/*** 安装 APK 文件*/private fun installApk(context: Context) {val apkFile = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// Android 10 及以上版本,使用应用专属目录File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "app-update.apk")} else {// Android 10 以下版本,使用公共下载目录File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "app-update.apk")}if (!apkFile.exists()) {Log.e(TAG, "APK 文件不存在")return}// 使用 FileProvider 获取文件的 Urival apkUri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", apkFile)// 创建安装 Intentval installIntent = Intent(Intent.ACTION_VIEW).apply {setDataAndType(apkUri, "application/vnd.android.package-archive")addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)// 适配 Android 7.0 及以上版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)}// 适配 Android 8.0 及以上版本,允许安装未知来源的应用if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {if (!context.packageManager.canRequestPackageInstalls()) {// 跳转到设置页面,允许安装未知来源应用val intent = Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply {data = Uri.parse("package:${context.packageName}")addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)}context.startActivity(intent)return}}}context.startActivity(installIntent)// 注销广播接收器和内容观察者context.unregisterReceiver(downloadCompleteReceiver)downloadObserver?.let {context.contentResolver.unregisterContentObserver(it)}}/*** 下载完成广播接收器*/private val downloadCompleteReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)if (id == downloadId) {progressListener?.onDownloadComplete()installApk(context)}}}/*** 下载进度观察者*/private inner class DownloadObserver(handler: Handler, private val downloadId: Long) : ContentObserver(handler) {override fun onChange(selfChange: Boolean) {super.onChange(selfChange)queryDownloadProgress()}private fun queryDownloadProgress() {val query = DownloadManager.Query().apply {setFilterById(downloadId)}context.contentResolver.query(Uri.parse("content://downloads/my_downloads"),null,null,null,null)?.use { cursor ->if (cursor.moveToFirst()) {val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))val bytesDownloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))val bytesTotal = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))when (status) {DownloadManager.STATUS_RUNNING -> {if (bytesTotal > 0) {val progress = ((bytesDownloaded * 100L) / bytesTotal).toInt()progressListener?.onProgress(progress)}}DownloadManager.STATUS_FAILED -> {progressListener?.onError("下载失败")}}}}}}/*** 下载进度监听器*/interface DownloadProgressListener {fun onProgress(progress: Int) // 下载进度(0-100)fun onError(message: String)  // 下载失败fun onDownloadComplete()      // 下载完成}
}

主要功能

  1. 断点续传

    • 支持网络中断后继续下载。
    • 通过 DownloadManagersetAllowedOverMeteredsetAllowedOverRoaming 方法实现。
  2. 自动安装 APK

    • 下载完成后自动触发安装流程。
    • 适配 Android 7.0 及以上版本的 FileProvider
    • 处理 Android 8.0 及以上版本的未知来源应用安装权限。
  3. 下载进度监听

    • 通过 ContentObserver 监听下载进度,实时回调进度值。
  4. 高版本兼容

    • 适配 Android 10 及以上版本的文件存储策略,使用应用专属目录。

使用方法

1. 初始化并下载文件

val downloadUtils = DownloadUtils.getInstance(context)
downloadUtils.downloadFile("https://example.com/file.apk","app-update.apk",object : DownloadUtils.DownloadProgressListener {override fun onProgress(progress: Int) {Log.d(TAG, "下载进度: $progress%")}override fun onError(message: String) {Log.e(TAG, "下载失败: $message")}override fun onDownloadComplete() {Log.d(TAG, "下载完成")}}
)

2. 配置 FileProvider

AndroidManifest.xml 中添加以下配置:

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

res/xml/file_paths.xml 中定义文件路径:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="downloads" path="Download/" />
</paths>

3. 添加权限

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

注意事项

  1. 存储权限

    • 在 Android 10 及以上版本中,使用应用专属目录无需申请 WRITE_EXTERNAL_STORAGE 权限。
    • 在 Android 10 以下版本中,需要动态申请 WRITE_EXTERNAL_STORAGE 权限。
  2. 未知来源应用安装

    • 在 Android 8.0 及以上版本中,需要引导用户开启“允许安装未知来源应用”权限。
  3. 文件路径

    • 确保 file_paths.xml 中定义的路径与代码中的路径一致。

通过以上工具类,你可以轻松实现 APK 下载、断点续传和自动安装功能,同时兼容 Android 高版本的文件存储策略和权限要求。

http://www.dtcms.com/wzjs/538704.html

相关文章:

  • 小说网站怎么做原创简单百度网址大全
  • 昆山网站建设兼职濉溪县最新通告今天
  • 网站建设费是广告费吗白头鹰网站一天可以做多少任务
  • 谎称在网站网站做维护在网站设计公司上班好吗
  • 可以网站可以做免费的文案广告语郑州证件制作
  • 安庆哪里做网站建设银行遵义分行网站
  • 晋江网站建设价格多少必要网站用什么做的
  • 想做网站的公司新产品上市推广策划方案模板
  • 企业做商城网站需要什么资质如何将域名指向网站
  • 两学一做材料上哪个网站找国内网站速度慢
  • 这几年做那些网站致富h5产品是什么意思
  • 建设银行海门支行网站简洁的公司网站
  • 怎样建网站才赚钱浙江久天建设有限公司网站
  • 营销网站都有哪些网站建设做什么
  • 响应式衣柜网站做资源网站违法吗
  • 盐城网站建设价格域名查询系统
  • 30岁女人学网站开发可以吗温州网站开发风格
  • 网站服务器放置地怎么填湖州市建设局官网
  • 付费资料网站开发控制面板网站
  • 做视频直播类型的网站中国最好的网站建设有哪些
  • 有个做搞笑视频的网站网站改用绝对地址的好处
  • 建设网站南沙网站首页包括哪些内容
  • 重庆网站设计案例下载男女做爰免费网站
  • 长春网站建设哪家公司好网站建设捌金手指花总十八
  • iis网站域名访问建设银行网银网站
  • 免费制作网站的软件上海关键词seo
  • 有实力的网站建设公司旅游网站开发 结束语
  • 开网站怎么开长沙营销型网站制作
  • 网易企业邮箱改密码厦门搜索引擎优化合作
  • 网站开发流程是什么东莞有哪些做网站