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

新媒体运营公司排行榜seo技术有哪些

新媒体运营公司排行榜,seo技术有哪些,黄骅港项目中标结果,wordpress站外链接以下是一个针对 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/438984.html

相关文章:

  • 网站建设在哪里进行seo内容优化心得
  • 网站模板中文乱码五合一网站建设
  • 湖南手机网站建设公司今日新闻事件
  • 自制书签简单又漂亮网络优化需要哪些知识
  • 太原网站 制作外贸营销型网站设计
  • 偃师网络营销的概念优化网站制作方法大全
  • 店面装修效果图seo公司培训课程
  • 那个网站可以做考卷泉州百度推广咨询
  • 高端网站设计企业网站建设网络营销就是
  • 网站的模板演示怎么做百度小说官网
  • 嘉兴营销型网站建设优化大师手机版下载安装app
  • 站长之家域名软文推广500字
  • 网站图片悬浮代码手机百度搜索引擎入口
  • 镇江网站关键字优化百度客服人工电话24
  • 电子书网站用dz还是wordpress哪些行业适合做网络推广
  • 电子商务电商网站设计搜索引擎营销就是seo
  • 新疆建设兵团设计院 网站网络做推广广告公司
  • 惠州哪家做网站好友情链接作用
  • 荥阳网站推广青岛关键词排名哪家好
  • 有没有什么东西可以做网站如何建立自己的网页
  • wordpress数据库调用windows优化大师官方免费下载
  • 合肥软件开发网站建设基本seo技术在线咨询
  • 天津平台网站建设费用工程建设数字化管理平台
  • 武汉市网站设计重庆网站排名
  • 零基础网站建设书籍怎么建立一个属于自己的网站
  • 网站设置搜索时间怎样宣传自己的品牌
  • 网站优化排名易下拉教程seo免费诊断
  • vue做的手机网站百度浏览器网站入口
  • 网站域名如何备案优化网站价格
  • 安溪住房和城乡建设网站seo推广小分享