1. 程式人生 > >android呼叫系統的安裝方法出現ActivityNotFoundException的異常

android呼叫系統的安裝方法出現ActivityNotFoundException的異常

今天測試下載新版本後自動安裝,結果報錯了~
這裡寫圖片描述

後來查了一下,是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);
    }