如何在MIUI设备上通过编程打开应用程序权限设置?

4
我希望打开这样的屏幕:设置 -> 应用 -> 选择一个应用程序 -> 打开应用权限屏幕
目前我使用了这段代码。它可以让我打开应用信息屏幕,但我不知道如何选择应用权限屏幕。
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Uri uri = Uri.fromParts("package", APP_PACKAGE_NAME, null);
                intent.setData(uri);
                startActivity(intent);

有些运行MIUI的设备具备应用程序权限屏幕。

这里有解决方案:https://dev59.com/WlwY5IYBdhLWcg3wQ16k - farukcankaya
@power 这不是问题所在。MIUI使用不同的权限外壳。 - Sanved
@TOP 你找到解决方案了吗? - Zakharov Roman
在https://dev59.com/yVoV5IYBdhLWcg3wi_OY#45206931上可以找到适用于所有MIUI版本的工作解决方案。 - Vivek Garg
3个回答

4

只需添加此代码并调用applyMiuiPermission()方法即可。

private static final String TAG = "MiuiUtils";

public static void applyMiuiPermission(Context context) {
    int versionCode = getMiuiVersion();
    if (versionCode == 5) {
        goToMiuiPermissionActivity_V5(context);
    } else if (versionCode == 6) {
        goToMiuiPermissionActivity_V6(context);
    } else if (versionCode == 7) {
        goToMiuiPermissionActivity_V7(context);
    } else {
        Log.e(TAG, "this is a special MIUI rom version, its version code " + versionCode);
    }
}


public static int getMiuiVersion() {
    String version = RomUtils.getSystemProperty("ro.miui.ui.version.name");
    if (version != null) {
        try {
            return Integer.parseInt(version.substring(1));
        } catch (Exception e) {
            Log.e(TAG, "get miui version code error, version : " + version);
        }
    }
    return -1;
}

public static void goToMiuiPermissionActivity_V5(Context context) {
    Intent intent = null;
    String packageName = context.getPackageName();
    intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts("package" , packageName, null);
    intent.setData(uri);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (isIntentAvailable(intent, context)) {
        context.startActivity(intent);
    } else {
        Log.e(TAG, "intent is not available!");
    }
}


public static void goToMiuiPermissionActivity_V6(Context context) {
    Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
    intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
    intent.putExtra("extra_pkgname", context.getPackageName());
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if (isIntentAvailable(intent, context)) {
        context.startActivity(intent);
    } else {
        Log.e(TAG, "Intent is not available!");
    }
}


public static void goToMiuiPermissionActivity_V7(Context context) {
    Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
    intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
    intent.putExtra("extra_pkgname", context.getPackageName());
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if (isIntentAvailable(intent, context)) {
        context.startActivity(intent);
    } else {
        Log.e(TAG, "Intent is not available!");
    }
}

RomUtils.Java

import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class RomUtils {
    private static final String TAG = "RomUtils";

    public static boolean checkIsMiuiRom() {
        return !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.name"));
    }
    public static String getSystemProperty(String propName) {
        String line;
        BufferedReader input = null;
        try {
            Process p = Runtime.getRuntime().exec("getprop " + propName);
            input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
            line = input.readLine();
            input.close();
        } catch (IOException ex) {
            Log.e(TAG, "Unable to read sysprop " + propName, ex);
            return null;
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    Log.e(TAG, "Exception while closing InputStream", e);
                }
            }
        }
        return line;
    }

    public static boolean checkIsMeizuRom() {
        return Build.MANUFACTURER.contains("Meizu");
    }
}

请提供那个RomUtils函数。 - Sachin Varma
1
我的答案已经编辑过了,请检查RomUtils类是否存在。 - Kunjeti Aswarthamaiah Gupta
谢谢,问题在于现在MIUI已经有了第9个版本,有没有什么办法处理它? - Sachin Varma
据我所知,版本9高于棉花糖,并且您可以检查权限并以常见方式请求权限。如果您无法理解,请问我一次,我会尽力详细解释,因为我的英语很差。 - Kunjeti Aswarthamaiah Gupta

3

尝试这个解决方案

Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", "app_package_name");

它只在MIUI 8上的Android 5.1中打开应用程序信息页面。 - Vikas Patidar
如何在MIUI 6及以上版本中添加弹窗权限,并且我的项目无法显示自定义来电界面。 - Ramani Hitesh

0

解决方案获取自这里

这段代码将打开应用程序权限设置

Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", getPackageName());
startActivity(localIntent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接