我使用下载管理器更新应用程序以获取新版本。但有些手机无法像 huawei Mate 20 .huawei P 20 那样工作。
有的时候可以,但是当用户使用一段时间后,它就不能下载了。
public static void downloadApk(Context context, String url, String title, final String appName) {
//获取存储的下载ID
long downloadId = SystemParams.getInstance().getLong(DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
if (downloadId != -1) {
//存在downloadId
DownLoadUtils downLoadUtils = DownLoadUtils.getInstance(context);
//获取当前状态
int status = downLoadUtils.getDownloadStatus(context, downloadId);
if (DownloadManager.STATUS_SUCCESSFUL == status) {
//状态为下载成功
//获取下载路径URI
Uri downloadUri = downLoadUtils.getDownloadUri(downloadId);
if (null != downloadUri) {
//存在下载的APK,如果两个APK相同,启动更新界面。否之则删除,重新下载。
if (compare(getApkInfo(context, downloadUri.getPath()), context)) {
startInstall(context, downloadUri);
return;
} else {
//删除下载任务以及文件
downLoadUtils.getDownloadManager().remove(downloadId);
}
}
start(context, url, title, appName);
} else if (DownloadManager.STATUS_FAILED == status) {
//下载失败,重新下载
start(context, url, title, appName);
} else {
Log.d(context.getPackageName(), "apk is already downloading");
}
} else {
//不存在downloadId,没有下载过APK
start(context, url, title, appName);
}
}
public int getDownloadStatus(Context context, long downloadId) {
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = mDownloadManager.query(query);
if (c != null) {
try {
boolean b = c.moveToFirst();
if (b) {
return c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
}
} finally {
c.close();
}
}
return -1;
}
我已经完成了调试,我发现 getDownloadStatus 方法返回 -1,因为代码 'c.moveToFirst()' 会跳转到 'finally'