首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PackageInstaller在MIUI优化模式下不起作用

PackageInstaller在MIUI优化模式下不起作用
EN

Stack Overflow用户
提问于 2021-05-27 16:24:53
回答 2查看 113关注 0票数 0

我创建了一个用于安装apk文件的测试应用程序。PackageInstaller就是用来做这个的。这款应用运行良好。然而,对于小米在BroadcastReceiver我得到了"INSTALL_FAILED_INTERNAL_ERROR:权限被拒绝“的错误。但是,如果您启用开发人员模式并禁用MIUI优化,则应用程序也会成功安装包。我不能让我的应用程序的用户强制他们关闭优化模式,我该如何处理这个问题?在MIUI 11版本上测试

EN

回答 2

Stack Overflow用户

发布于 2021-07-04 13:27:49

您可以检测用户是否启用了MIUI和优化模式,并显示一条消息,强制用户禁用它。使用以下实用方法(它是拆分APK安装程序源代码的一部分):https://github.com/Aefyr/SAI/blob/master/app/src/main/java/com/aefyr/sai/utils/MiuiUtils.java

票数 0
EN

Stack Overflow用户

发布于 2021-08-23 13:27:20

似乎MIUI 20.2.20解决了这个不兼容问题。solru's answer会对此进行检查。

如果GitHub链路停止工作:

代码语言:javascript
复制
    public static boolean isMiui() {
        return !TextUtils.isEmpty(Utils.getSystemProperty("ro.miui.ui.version.name"));
    }

    public static String getMiuiVersionName() {
        String versionName = Utils.getSystemProperty("ro.miui.ui.version.name");
        return !TextUtils.isEmpty(versionName) ? versionName : "???";
    }

    public static int getMiuiVersionCode() {
        try {
            return Integer.parseInt(Objects.requireNonNull(Utils.getSystemProperty("ro.miui.ui.version.code")));
        } catch (Exception e) {
            return -1;
        }
    }

    public static String getActualMiuiVersion() {
        return Build.VERSION.INCREMENTAL;
    }

    private static int[] parseVersionIntoParts(String version) {
        try {
            String[] versionParts = version.split("\\.");
            int[] intVersionParts = new int[versionParts.length];

            for (int i = 0; i < versionParts.length; i++)
                intVersionParts[i] = Integer.parseInt(versionParts[i]);

            return intVersionParts;
        } catch (Exception e) {
            return new int[]{-1};
        }
    }

    /**
     * @return 0 if versions are equal, values less than 0 if ver1 is lower than ver2, value more than 0 if ver1 is higher than ver2
     */
    private static int compareVersions(String version1, String version2) {
        if (version1.equals(version2))
            return 0;

        int[] version1Parts = parseVersionIntoParts(version1);
        int[] version2Parts = parseVersionIntoParts(version2);

        for (int i = 0; i < version2Parts.length; i++) {
            if (i >= version1Parts.length)
                return -1;

            if (version1Parts[i] < version2Parts[i])
                return -1;

            if (version1Parts[i] > version2Parts[i])
                return 1;
        }

        return 1;
    }

    public static boolean isActualMiuiVersionAtLeast(String targetVer) {
        return compareVersions(getActualMiuiVersion(), targetVer) >= 0;
    }

    @SuppressLint("PrivateApi")
    public static boolean isMiuiOptimizationDisabled() {
        if ("0".equals(Utils.getSystemProperty("persist.sys.miui_optimization")))
            return true;

        try {
            return (boolean) Class.forName("android.miui.AppOpsUtils")
                    .getDeclaredMethod("isXOptMode")
                    .invoke(null);
        } catch (Exception e) {
            return false;
        }
    }

    public static boolean isFixedMiui() {
        return isActualMiuiVersionAtLeast("20.2.20") || isMiuiOptimizationDisabled();
    }

最终,您要查找的函数是isMiuiisMiuiFixed

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67718409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档