android呼叫系統的安裝方法出現ActivityNotFoundException的異常
阿新 • • 發佈:2019-01-10
今天測試下載新版本後自動安裝,結果報錯了~
後來查了一下,是DownloadManager的問題~
從Android 4.2開始,manager.getUriForDownloadedFile(id)將返回的scheme是content,返回uri是content://downloads/my_downloads/15,沒有給出路徑,這樣呼叫系統的安裝方法就會出現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;
}
或者使用另外一種方式實現。
1.設定下載路徑和檔名 本地記錄檔名稱
DownloadManager.Request request = new DownloadManager.Request(uri);
String filename = name + ".apk";
request.setDestinationInExternalPublicDir("download", filename );
2.呼叫系統安裝的時候根據第一步記錄的檔名稱filename 來獲取URI 而不是根據request返回的 downloadID引數
/**
* 開啟APK程式程式碼,安裝應用
*/
public void openFileForInstall() {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), filename ));
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
}