Installer et mettre à jour l'adaptation Android 7.0 et plus

    Récemment, je prévois d'ajouter une fonction de téléchargement et de mise à jour à l'application. J'ai pensé que c'était simple et j'ai réussi le test moi-même. Mais après l'avoir envoyé au test, j'ai constaté que le téléchargement de l'apk était terminé et que la page d'installation ne l'a pas été pop up. J'étais déprimé.

    La méthode originale est écrite comme ceci:

    /**
     * android1.x-6.x
     *
     * @param path 文件的路径
     */
    public void startInstall(Context context, String path) {
        Intent install = new Intent(Intent.ACTION_VIEW);
        install.setDataAndType(Uri.parse("file://" + path), "application/vnd.android.package-archive");
        install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        context.startActivity(install);
    }

    Après une ronde d'inspection, il a été constaté qu'il s'agissait d'un problème avec le fournisseur ajouté par Android 7.0. Le chemin absolu du fichier ne peut pas être utilisé, mais il doit être utilisé. L'URI obtenu via le fournisseur est installé. La modification la version est la suivante:

    /**
     * android o 以上
     * @param context
     * @param path
     */
    public void startInstallTest(Context context, String path) {
        Uri uri = FileProvider.getUriForFile(context.getApplicationContext(), "your provider authority", new File(path));
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        if (MIUIUtils.isMIUI()) {
            ComponentName companent = new ComponentName("com.miui.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity");
            intent.setComponent(companent);
        }
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(intent);
    }

    Ce qui précède a révélé que la page d'installation ne peut pas être affichée dans le système Xiaomi, mais que d'autres peuvent l'installer. En imprimant le journal système, j'ai constaté qu'il me manquait un composant spécifique à Xiaomi dans le journal ActivityManager, je l'ai donc ajouté après jugement .

    L'appel complet est le suivant:

private void checkInstall(String path) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            startInstallTest(this, path);
        } else {
            startInstall(this, path);
        }
    }

 

    À propos, ajoutez la classe d'outils pour juger miui:

public class MIUIUtils {
    // 检测MIUI
    private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
    private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
    private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";

    public static boolean isMIUI() {
        Properties prop = new Properties();
        boolean isMIUI;
        try {
            prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        isMIUI = prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
                || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
                || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;

        return isMIUI;
    }
}

    Voici les problèmes que j'ai rencontrés lors du processus de développement, de téléchargement et de mise à jour. Certains téléphones portables doivent d'abord être autorisés et un prétraitement doit être ajouté. Cependant, je n'ai pas rencontré de tels modèles, je ne parlerai donc pas de la portée de cette De plus, je vais joindre Télécharger les outils du package apk

Je suppose que tu aimes

Origine blog.csdn.net/HeartCircle/article/details/107014520
conseillé
Classement