Android 下載並安裝apk,兼容7.0和8.0

一、下載apk文件

下載的方式有不少種,經常使用的有:android

(1)調用系統下載器下載,須要設置通知來接受下載完成的操做,而後進入安裝流程瀏覽器

(2)最簡單的,直接調起系統瀏覽器訪問apk下載連接,後續的事情都無論,等下載完了用戶自行安裝網絡

(3)本身寫下載代碼,缺點是不如前二者穩定,優勢是下載進度和狀態可控app

我這裏使用的是第三種,而後下載代碼並不本身寫,而是直接調用OkHttpUtils框架,OkHttpUtils框架的配置跟導入這裏再也不贅述,具體本身查一下用法,直接上下載代碼(不要忘了網絡權限跟存儲權限):框架

isDownloading = true;//是否正在下載,同一時間不給同時進行多個下載任務
        final TextLoadingPopupWindow textLoadingPopupWindow = new TextLoadingPopupWindow(getActivity());//進度提示彈窗,具體替換本身的彈窗,這裏不提供
        textLoadingPopupWindow.setText("00.0%");
        textLoadingPopupWindow.show();
        OkHttpUtils.get(url)
                .execute(new FileCallback(new PathUtil().getMusicEditorPath(), UUID.randomUUID().toString() + ".apk") {//這裏指定下載保存文件的路徑
                    @Override
                    public void onSuccess(File file, Call call, Response response) {
                        isDownloading = false;
                        textLoadingPopupWindow.dismiss();
                        installApp(file);//下載完成,調起安裝
                    }

                    public void onError(Call call, Response response, Exception e) {
                        isDownloading = false;
                        textLoadingPopupWindow.dismiss();
                        ToastUtils.showToast(getContext(), "下載出錯");
                    }

                    public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                        textLoadingPopupWindow.setText((int) (progress * 100) + "." + (int) (progress * 1000) % 10 + "%");//進度顯示,處於UI線程
                    }
                });

二、安裝apk

文件準備好了以後就是安裝了,安裝主要須要注意7.0和8.0兩個系統的兼容.dom

(1)7.0適配ide

須要用到fileprovider,須要在res文件夾下建立一個xml文件,我這裏叫xxxxxx.xml,主要就是配置幾個路徑,你須要安裝的apk文件在調用安裝以前,須要先移到這幾個路徑之下才能夠。ui

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="xxxxx" path="xxxxx" />
</paths>

xml準備好了以後,須要去AndroidManifest.xml裏面配置一下url

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="這裏替換成你的包名.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/xxxxx" />
        </provider>

(2)8.0適配spa

適配了7.0以後,8.0基本上沒啥問題了,惟一的區別就是8.0須要加上一個權限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

若是以爲有必要的話,8.0能夠在調起安裝以前校驗一下本應用是否已經有了能夠安裝其餘應用的權限,若是沒有則直接跳轉到手機設置的相關頁面,這裏須要說一下,在我親測的幾臺手機中,若是使用了這個邏輯,基本上是會跳轉到一個設置頁面,頁面是一籮筐的應用列表,很難找到本身的app並進去設置「容許安裝未知應用」這個東西,我的以爲這個體驗很很差,而若是是直接調用安裝代碼,則系統會自發的提示是否須要開啓這個應用「容許安裝未知應用」的這個東西,因此這裏的代碼就是執行直接調起安裝操做,是否具有權限就不驗證了。

/**
     * 調起安裝
     *
     * @param file
     */
    private void installApp(File file) {
        if (file == null || !file.getPath().endsWith(".apk")) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);

        //判讀版本是否在7.0以上
        if (Build.VERSION.SDK_INT >= 24) {
            Uri apkUri = FileProvider.getUriForFile(getActivity(), "你的包名.fileprovider", file);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        }
        getActivity().startActivity(intent);
    }

本代碼在7.0的vivo手機和8.0的小米手機上親測有效。

相關文章
相關標籤/搜索