Android:使用 DownloadManager 进行版本更新
app 以前的版本更新使用的自己写的代码从服务器下载,结果出现了下载完成以后,提示解析包错误的问题,但是呢,找到该 apk 点击安装是可以安装成功的,估计就是最后几秒安装包没有下载完成然后点击了安装出现的解析包错误的问题。目前修改为通过 DownloadManager 进行下载。
代码如下:
1. 判断当前是否可以使用 DownloadManager (根据搜索结果,反馈说有些国产手机会把 DownloadManager 进行阉割掉,目前测试在 Nexus6, 华为Mate9, 小米 Note,华为Mate8, HTC D820U, 三星 S7 上可以使用)
private static boolean canDownloadState(Context ctx) {
try {
int state = ctx.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
|| state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
|| state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
2. 出现可以使用和不可以使用的情况。可以使用的话,就使用 DownloadManager 进行下载,不可以使用就交给浏览器进行下载
if (canDownloadState(ctx)) {
MLog.d("UpdateVersion", "DownloadManager 可用");
Intent downloadApkIntent = new Intent(ctx, DownApkServer.class);
Bundle bundle = new Bundle();
bundle.putString("downloadUrl", url);
bundle.putString("title", subAppName);
downloadApkIntent.putExtra("download", bundle);
ctx.startService(downloadApkIntent);
} else {
MLog.d("UpdateVersion", "DownloadManager 不可用");
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
ctx.startActivity(intent);
}
3. 启动 DownApkServer 服务
public class DownApkServer extends Service {
static final String TAG = "DownApkServer";
Context context = this;
SharedPreferences mSp;
public DownApkServer() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Bundle downloadBundle = intent.getBundleExtra("download");
if (downloadBundle != null) {
String downloadUrl = downloadBundle.getString("downloadUrl");
String title = downloadBundle.getString("title");
if (!TextUtils.isEmpty(downloadUrl)) {
mSp = context.getSharedPreferences("downloadApk", MODE_PRIVATE);
long downloadId = downloadApk(downloadUrl, title);
mSp.edit().putLong("downloadId", downloadId).commit();
}
}
stopSelf();
return super.onStartCommand(intent, flags, startId);
}
private long downloadApk(String url, String title) {
Uri downloadUri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
String apkName = title + ".apk";
File file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/" + apkName);
if (file != null && file.exists()) {
file.delete();
}
request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS,
apkName);
mSp.edit().putString("apkName", apkName).commit();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
request.setTitle(title);
DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
return mDownloadManager.enqueue(request);
}
}
4. 注册一个广播,DownApkReceiver
public class DownApkReceiver extends BroadcastReceiver {
private static final String TAG = "DownApkReceiver";
SharedPreferences mSharedP;
DownloadManager mManager;
Context ctx;
@Override
public void onReceive(Context context, Intent intent) {
ctx = context;
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
long downloadApkId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
mSharedP = context.getSharedPreferences("downloadApk", MODE_PRIVATE);
long saveApkId = mSharedP.getLong("downloadId", -1L);
if (downloadApkId == saveApkId) {
checkDownloadStatus(context, downloadApkId);
}
}
}
private void checkDownloadStatus(Context context, long downloadId) {
mManager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
Cursor cursor = mManager.query(query);
if (cursor.moveToFirst()) {
int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
case DownloadManager.STATUS_SUCCESSFUL:
installApk(context);
break;
case DownloadManager.STATUS_FAILED:
MLog.d("DownApkReceiver", "下载失败.....");
break;
case DownloadManager.STATUS_RUNNING:
MLog.d("DownApkReceiver", "正在下载.....");
break;
default:
break;
}
}
}
private void installApk(Context context) {
String apkName = mSharedP.getString("apkName", null);
if (apkName != null) {
MLog.d("DownApkReceiver", "apkName 为" + apkName);
File file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/" + apkName);
if (file != null) {
Intent install = new Intent("android.intent.action.VIEW");
Uri downloadFileUri = Uri.fromFile(file);
install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(install);
} else {
MLog.d("DownApkReceiver", "下载失败");
}
} else {
MLog.d("DownApkReceiver", "apkName 为 null");
}
}
}
5. 在清单文件中,注册该广播
<receiver android:name=".subapps.api.utils.DownApkReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"></action>
</intent-filter>
</receiver>
Android:使用 DownloadManager 进行版本更新的更多相关文章
- Android 使用DownloadManager进行版本更新的完整方案
在Android App都会有版本更新的功能,以前我们公司是用友盟SDK更新功能,自己服务器没有这样的功能.版本检测.Apk下载都是使用友盟.最近看到友盟的版本更新SDK文档:十月份更新功能将会停止服 ...
- Android:使用 DownloadManager 进行版本更新,出现 No Activity found to handle Intent 及解决办法
项目中,进行版本更新的时候,用的是自己写的下载方案,最近看到了使用系统服务 DownloadManager 进行版本更新,自己也试试. 在下载完成以后,安装更新的时候,出现了一个 crash,抓取的 ...
- android SDK与ADT版本更新问题
android SDK与ADT版本更新问题 问题:This Android SDK requires Android Developer Toolkit version 14.0.0 or above ...
- Android 演示 DownloadManager——Android 下载 apk 包并安装
本文内容 环境 项目结构 演示下载 参考资料 本文是 github 上 Trinea-Android-common 和 Trinea-Android-Demo 项目的一部分,将下载部分分离出来,看看如 ...
- Android 使用 DownloadManager 管理系统下载任务的方法,android管理系统
从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager ...
- [置顶] Android应用开发之版本更新你莫愁
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 今天我们学习如何实现Android应用的自动更新版本功能,这是在各种语言编写的应用中都 ...
- Android 全局弹出版本更新 Dialog 思考和解决办法
Android 针对版本更新,需要做全局的弹出(需求:版本更新只需要在 App 内全局弹出就可以),思路是使用 AlertDialog ,然后设置 setType 为 TYPE_ALERT_WINDO ...
- Android 使用 DownloadManager 管理系统下载任务的方法
在红黑联盟上看到的.这几天一直考虑做一个Notification 的带下载功能的自己定义通知.但没搞出来.无意中在论坛看到这个.先Mark,明天试试. 从Android 2.3(API level 9 ...
- Android中实现app版本更新
1,获取本地程序apk版本,并开启服务(下面这段代码一般在主Activity中的onCreate()方法中执行的,并开启后台服务下载新版本的apk) //获取apk包文件的管理者对象 PackageM ...
随机推荐
- leetcode笔记:Bulls and Cows
一. 题目描写叙述 You are playing the following Bulls and Cows game with your friend: You write down a numbe ...
- 饭后来份TempData,瞅瞅有啥料
原本打算写一篇关于.NET下的分布式缓存的随笔,但是为了举一个实际的运用,就想把控制器(是ASP.NET MVC的)中的Session替换成使用分布式缓存来实现.如果你的网站最后是需要负载均衡的话,这 ...
- python之模块copy_reg(在python3中为copyreg,功能基本不变)
# -*- coding: utf-8 -*-#python 27#xiaodeng#python之模块copy_reg(在python3中为copyreg,功能基本不变) import copy_r ...
- Centos安装Oracle数据库文本记录
题记,本文旨在记录图形化安装过程,的过程...仅仅是回忆性学习... oracle账号登陆图形界面 #没有图形化,图形检查不通过 运行终端 Terminal cd /u01/database . ...
- 转:Ogre源码分析之Root类、Facade模式
Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...
- 【bootstrapV3】移动端和PC端的 滚动监听
1.本代码适用于 bootstrap V3 的 页面滚动监听 2.效果: 3.代码: <!DOCTYPE html> <html lang="zh-CN"> ...
- JS中文转换(UTF-8),url传递中文乱码解决
来源于:http://blog.csdn.net/kuangfengbuyi/article/details/45557437 js合成url时,如果参数是中文,传到struts2中会乱码,解决办法如 ...
- Indy Changed from Indy10
Indy Changed from Indy10 http://stackoverflow.com/questions/16339656/delphi-xe4-indy-compatibility-i ...
- Selenium webdriver 获取属性值 元素里的value
1.WebElement webElemt= webElement.findElement(By.xpath("//*[@class='xxxxxx]/a")); //在ie下使用 ...
- iostat 监视I/O子系统
iostat是I/O statistics(输入/输出统计)的缩写,用来动态监视系统的磁盘操作活动. 11.1. 命令格式 iostat[参数][时间][次数] 11.2. 命令功能 通过iostat ...