今天项目中使用到APK更新,同时实现自动安装(静默安装),安装完成后,启动最新安装的APK。
版本判断
请求服务器,判断版本,下载apk
下载APK
http.download(ApkUrl, "/sdcard/Download/" + fileName, true,
new RequestCallBack<File>() {
@Override
public void onStart() {
LogUtils.d("conn...");
}
@Override
public void onLoading(long total, long current,
boolean isUploading) {
LogUtils.d("reply: " + current + "/" + total);
}
@Override
public void onFailure(HttpException error, String msg) {
mHandle.postDelayed(new splashhandler(), 300);
LogUtils.e(error.getExceptionCode() + ":" + msg);
error.printStackTrace();
}
@Override
public void onSuccess(ResponseInfo<File> arg0) {
LogUtils.d("LoadingActivity: down apk success");
// 安装apk
Intent installAPKIntent = DownloadAPKUtils.installAPK(
context, fileName);
startActivityForResult(installAPKIntent, 9001);
}
});
}
安装APK
Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File("/sdcard/Download/", fileName);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
启动APK
public static Intent openUpdateAPK(Context context, String packageName) {
if (null == packageName)
return null;
PackageManager pm = context.getPackageManager();
Intent mainTntent = new Intent(Intent.ACTION_MAIN, null);
mainTntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> reesolveInfos = pm.queryIntentActivities(mainTntent,
PackageManager.GET_INTENT_FILTERS);
Collections.sort(reesolveInfos, new ResolveInfo.DisplayNameComparator(
pm));
for (ResolveInfo reInfo : reesolveInfos) {
String activityName = reInfo.activityInfo.name;
String pkgName = reInfo.activityInfo.packageName;
String appLabel = (String) reInfo.loadLabel(pm);
Intent launchIntent = new Intent();
launchIntent.setComponent(new ComponentName(pkgName, activityName));
return launchIntent;
}
return null;
}
如有问题一起讨论!