Android:使用 DownloadManager 进行版本更新【转】

app 以前的版本更新使用的自己写的代码从服务器下载,结果出现了下载完成以后,提示解析包错误的问题,但是呢,找到该 apk 点击安装是可以安装成功的,估计就是最后几秒安装包没有下载完成然后点击了安装出现的解析包错误的问题。目前修改为通过 DownloadManager 进行下载。

代码如下:

1. 判断当前是否可以使用 DownloadManager (根据搜索结果,反馈说有些国产手机会把 DownloadManager 进行阉割掉,目前测试在 Nexus6, 华为Mate9, 小米 Note,华为Mate8, HTC D820U, 三星 S7 上可以使用)

 1     private static boolean canDownloadState(Context ctx) {
 2         try {
 3             int state = ctx.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
 4 
 5             if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
 6                     || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
 7                     || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
 8                 return false;
 9             }
10         } catch (Exception e) {
11             e.printStackTrace();
12             return false;
13         }
14         return true;
15     }

2. 出现可以使用和不可以使用的情况。可以使用的话,就使用 DownloadManager 进行下载,不可以使用就交给浏览器进行下载

 1                 if (canDownloadState(ctx)) {
 2                     MLog.d("UpdateVersion", "DownloadManager 可用");
 3                     Intent downloadApkIntent = new Intent(ctx, DownApkServer.class);
 4                     Bundle bundle = new Bundle();
 5                     bundle.putString("downloadUrl", url);
 6                     bundle.putString("title", subAppName);
 7                     downloadApkIntent.putExtra("download", bundle);
 8                     ctx.startService(downloadApkIntent);
 9                 } else {
10                     MLog.d("UpdateVersion", "DownloadManager 不可用");
11                     Intent intent = new Intent();
12                     intent.setAction("android.intent.action.VIEW");
13                     Uri content_url = Uri.parse(url);
14                     intent.setData(content_url);
15                     ctx.startActivity(intent);
16                 }

3. 启动 DownApkServer 服务

1 public class DownApkServer extends Service {
 2     static final String TAG = "DownApkServer";
 3     Context context = this;
 4     SharedPreferences mSp;
 5 
 6     public DownApkServer() {
 7 
 8     }
 9 
10     @Override
11     public IBinder onBind(Intent intent) {
12         return null;
13     }
14 
15     @Override
16     public int onStartCommand(Intent intent, int flags, int startId) {
17         Bundle downloadBundle = intent.getBundleExtra("download");
18         if (downloadBundle != null) {
19             String downloadUrl = downloadBundle.getString("downloadUrl");
20             String title = downloadBundle.getString("title");
21             if (!TextUtils.isEmpty(downloadUrl)) {
22                 mSp = context.getSharedPreferences("downloadApk", MODE_PRIVATE);
23                 long downloadId = downloadApk(downloadUrl, title);
24                 mSp.edit().putLong("downloadId", downloadId).commit();
25             }
26         }
27         stopSelf();
28         return super.onStartCommand(intent, flags, startId);
29     }
30 
31 
32     private long downloadApk(String url, String title) {
33         Uri downloadUri = Uri.parse(url);
34         DownloadManager.Request request = new DownloadManager.Request(downloadUri);
35         String apkName = title + ".apk";
36         File file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/" + apkName);
37         if (file != null && file.exists()) {
38             file.delete();
39         }
40         request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS,
41                 apkName);
42         mSp.edit().putString("apkName", apkName).commit();
43         request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
44         request.setVisibleInDownloadsUi(true);
45         request.setTitle(title);
46         DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
47         return mDownloadManager.enqueue(request);
48     }
49 }

4. 注册一个广播,DownApkReceiver

 1 public class DownApkReceiver extends BroadcastReceiver {
 2     private static final String TAG = "DownApkReceiver";
 3     SharedPreferences mSharedP;
 4     DownloadManager mManager;
 5     Context ctx;
 6 
 7     @Override
 8     public void onReceive(Context context, Intent intent) {
 9         ctx = context;
10         if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
11             long downloadApkId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
12             mSharedP = context.getSharedPreferences("downloadApk", MODE_PRIVATE);
13             long saveApkId = mSharedP.getLong("downloadId", -1L);
14             if (downloadApkId == saveApkId) {
15                 checkDownloadStatus(context, downloadApkId);
16             }
17         }
18     }
19 
20     private void checkDownloadStatus(Context context, long downloadId) {
21         mManager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
22         DownloadManager.Query query = new DownloadManager.Query();
23         query.setFilterById(downloadId);
24         Cursor cursor = mManager.query(query);
25         if (cursor.moveToFirst()) {
26             int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
27             switch (status) {
28                 case DownloadManager.STATUS_SUCCESSFUL:
29                     installApk(context);
30                     break;
31                 case DownloadManager.STATUS_FAILED:
32                     MLog.d("DownApkReceiver", "下载失败.....");
33                     break;
34                 case DownloadManager.STATUS_RUNNING:
35                     MLog.d("DownApkReceiver", "正在下载.....");
36                     break;
37                 default:
38                     break;
39             }
40         }
41     }
42 
43     private void installApk(Context context) {
44         String apkName = mSharedP.getString("apkName", null);
45         if (apkName != null) {
46             MLog.d("DownApkReceiver", "apkName 为" + apkName);
47             File file = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS + "/" + apkName);
48             if (file != null) {
49                 Intent install = new Intent("android.intent.action.VIEW");
50                 Uri downloadFileUri = Uri.fromFile(file);
51                 install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
52                 install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
53                 context.startActivity(install);
54             } else {
55                 MLog.d("DownApkReceiver", "下载失败");
56             }
57         } else {
58             MLog.d("DownApkReceiver", "apkName 为 null");
59         }
60     }
61 }

5. 在清单文件中,注册该广播

1         <receiver android:name=".subapps.api.utils.DownApkReceiver">
2             <intent-filter>
3                 <action android:name="android.intent.action.DOWNLOAD_COMPLETE"></action>
4             </intent-filter>
5         </receiver>

转自 https://www.cnblogs.com/liyiran/p/6393813.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容