在Android Studio中检测及启用/禁用小米手机其他权限的方法
小米手机「其他权限」的检测、启用与禁用实现方案(Android Studio)
你当前的代码仅能跳转至MIUI权限编辑总页,无法实现权限检测、精准跳转至目标权限项的需求,以下是针对性解决方案:
现有代码回顾
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = findViewById(R.id.btncheck); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR"); intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"); intent.putExtra("extra_pkgname", getPackageName()); startActivity(intent); } }); }
一、检测「其他权限」状态
MIUI的「其他权限」大多基于系统AppOpsManager实现,可通过以下工具类检测常见权限状态:
import android.app.AppOpsManager; import android.content.Context; import android.os.Build; public class MiuiPermissionChecker { // 检测「后台弹出界面」权限 public static boolean isBackgroundPopupAllowed(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { AppOpsManager appOps = context.getSystemService(AppOpsManager.class); int mode = appOps.checkOpNoThrow("android:allow_background_activity_starts", android.os.Process.myUid(), context.getPackageName()); return mode == AppOpsManager.MODE_ALLOWED; } // 低版本MIUI可尝试反射获取,或返回默认状态 return false; } // 检测「显示悬浮窗」权限(其他权限常见项) public static boolean isOverlayAllowed(Context context) { return android.provider.Settings.canDrawOverlays(context); } // 检测「修改系统设置」权限 public static boolean isWriteSettingsAllowed(Context context) { return android.provider.Settings.System.canWrite(context); } }
二、精准跳转至目标权限页
若想直接跳转到某一项权限的设置界面,可在Intent中添加权限参数(注:MIUI私有参数无公开文档,不同版本可能有差异,需多版本验证):
mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR"); intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"); intent.putExtra("extra_pkgname", getPackageName()); // 示例:跳转至「显示悬浮窗」权限设置页,参数需根据MIUI版本调整 intent.putExtra("extra_perm_name", "android.permission.SYSTEM_ALERT_WINDOW"); // 跳转前判断Intent是否可解析,避免崩溃 if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { // 兼容方案:跳转到应用详情页 Intent fallbackIntent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); fallbackIntent.setData(android.net.Uri.fromParts("package", getPackageName(), null)); startActivity(fallbackIntent); } } });
三、关于权限的启用/禁用
系统安全限制:Android系统(包括MIUI)不允许APP直接修改自身权限状态,只能引导用户手动操作。因此无法通过代码直接启用或禁用权限,只能通过跳转至设置页,引导用户完成操作。
注意事项
- 不同MIUI版本的安全中心包名可能变化,比如部分旧版本使用
com.miui.security,需做兼容性判断 - 部分MIUI独有权限的AppOps操作项需自行测试确认,可通过反编译MIUI安全中心获取对应参数
- 跳转前必须判断Intent是否可解析,避免出现ActivityNotFoundException
内容的提问来源于stack exchange,提问作者Darshan Makhecha
相关产品推荐
相关产品推荐

