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 ...
随机推荐
- Java程序监控指标
监控指标: 1.CPU平均使用率 2.内存平均使用率 3.应用程序错误数 4.应用程序请求量 5.应用平均响应时间 6.硬件I/O指标 7.JMX 7.1.Full gc count 7.2.Full ...
- java 中文及特殊字符校验
java 中文及特殊字符校验 CreateTime--2017年8月25日16:54:50 Author:Marydon 一.参考链接 http://blog.csdn.net/imduan/ar ...
- Cocos2d-x执行时错误:Cocos2d: Get data from file(xxx.xxx) failed!
取资源图片时遇到执行时错误: Cocos2d: Get data from file(xxx/xxx.xxx) failed! 原因是我加入资源目录的方式不正确,例如以下图,我选择的是在Resourc ...
- Easyui入门视频教程 第05集---Easyui复杂布局
目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义 Easyui入门视频教程 第08集---登录实现 ajax button的使用 ...
- 老男孩linux实战培训初级班第三次课课前考试题
################################################################ 本文内容摘录于老男孩linux实战运维培训中心考试题 如有转载,请务必 ...
- wait3和wait4函数(转)
wait3和wait4函数除了可以获取子进程状态转变信息外,还可以获得子进程的资源使用信息. pid_t wait3 ( int *status, int option, struct rusage ...
- Ubuntu菜鸟入门(十二)—— 主题美化
一.unity-tweak-tool 1.软件介绍 调整 Unity 桌面环境,还是推荐使用Unity Tweak Tool,这是一个非常好用的 Unity 图形化管理工具,可以修改工作区数量.热区等 ...
- java生成PDF,各种格式、样式、水印都有
代码中有两处需要图片,请自行替换. 一个是水印.一个是手指. 需要的JAR包链接:http://download.csdn.net/detail/justinytsoft/9688893 下面是预览: ...
- 【jsp】怎么在jsp文件中引入静态文件(.js .css)
如果在jsp文件中引入静态文件比如(.js或.css等等),可以在使用 /项目名称/路径 的方式,但是这种方式如果在修改了项目了名称后就显得比较麻烦了.除了之外还许多方式,比如相对路径等等.一般情况下 ...
- solr开发从查询结果集中获取对象数据
solrJ从查询结果集中获取对象数据. 方案一:自定义转换方式 /** * * SolrDocument与实体类转换 [测试通过] * * @author pudongping * * @param ...