从Android 4.2开始,manager.getUriForDownloadedFile(id)
将返回的scheme
是content
,返回uri
是content://downloads/my_downloads/<id>
,没有给出路径,这样调用系统的安装方法就会出现ActivityNotFoundException的异常,我找了很久终于找到了文件放在了哪里。
下面我把转化content
的Uri
为file的Uri
方法分享给大家;
/**
* 转化contentUri为fileUri
*
* @param contentUri 包含content的Uri
* @param downLoadId 下载方法返回系统为当前下载请求分配的一个唯一的ID
* @param manager 系统的下载管理
*
* @return fileUri
*/
private Uri getApkFilePathUri(Uri contentUri, long downLoadId, DownloadManager manager) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downLoadId);
Cursor c = manager.query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
// 下载失败也会返回这个广播,所以要判断下是否真的下载成功
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
// 获取下载好的 apk 路径
String downloadFileLocalUri = c.getString(c.getColumnIndex(DownloadManager
.COLUMN_LOCAL_URI));
if (downloadFileLocalUri != null) {
File mFile = new File(Uri.parse(downloadFileLocalUri).getPath());
String uriString = mFile.getAbsolutePath();
// 提示用户安装
contentUri = Uri.parse("file://" + uriString);
}
}
}
return contentUri;
}
然后就可以调用这个方法来启动安装了
java
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);