1. 程式人生 > >Android7.0-8.0app更新

Android7.0-8.0app更新

在做app時,你想上線就必須要做更新的介面

首先在做驗證時你需要打包,把AS安裝的解除安裝掉然後在安裝打包的apk;

7.0,8.0都需要許可權

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

在AndroidManifest中加入:

/*

注意:在有的手機上你做測試時會發現一直在

Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);

這裡一直卡住報錯;有可能和我最開始的原因一樣,在BuildConfig.APPLICATION_ID+".provider"及authorities="你的包名.provider"使用的是authorities="你的包名.fileprovider",把兩個地方的fileprovider改成provider就可以了

*/  

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="你的包名.provider"
            android:grantUriPermissions="true"
            android:exported="false"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

 怎麼下載安裝包就不說了,網上大把教材,我在下載好後安裝更新這卡了半天!

7.0-8.0安裝其實差不大多,只不過8.0,需要申請許可權

 /**
     * 判斷是否是8.0,8.0需要處理未知應用來源許可權問題,否則直接安裝
     */
    private void checkIsAndroidO(File file) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            boolean b = getPackageManager().canRequestPackageInstalls();
            if (b) {
                installApk(file);//安裝應用的邏輯(寫自己的就可以)
            } else {
                //請求安裝未知應用來源的許可權
                new ToastUtil().showToast(Frag_Set_Set.this,"請開啟安裝未知來源應用的許可權,否則無法正常安裝!",2000);
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 0);
            }
        }else {
            installApk(file);
        }

    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 0:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    installApk(file);
                } else {

                    //沒有許可權 在 yourAppPackageName 設定你的app包名
                    Uri packageURI = Uri.parse("package:" + getPackageName());
                    Logutil.w(tag,"-->"+packageURI);
                    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                    Frag_Set_Set.this.startActivityForResult(intent, 1);
                }
                break;

        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                checkIsAndroidO(file);
                break;
            default:
                break;
        }
    }

 然後就是安裝了:

/**
     * 安裝apk
     */
    private void installApk(File file) {
        if (Build.VERSION.SDK_INT>=24){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
                if (!hasInstallPermission) {
                    checkIsAndroidO(file);
                    return;
                }
//                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            i.addFlags(Intent
        .FLAG_ACTIVITY_NEW_TASK);//開啟一個執行緒,防止安裝好後開啟時閃退
            Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);
            Logutil.w(tag,"-->"+BuildConfig.APPLICATION_ID+".provider");
            i.setDataAndType(apkUri, "application/vnd.android.package-archive");
            startActivity(i);
        }
        //7.0以下相容
        else {
            try {
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
                startActivity(i);
            }catch (Exception e){
            }

        }
    }

 /*

注意:你在安裝好後殿開啟時出現閃退,是因為你需要開一個執行緒出來:i.addFlags(Intent .FLAG_ACTIVITY_NEW_TASK);

Android7.0,8.0更新app

*/