小米Mi 9T设备Android无障碍权限请求异常问题求助
解决方案:MIUI设备上无障碍权限跳转与检测问题
问题1:跳转无障碍设置页面不符合预期
MIUI对系统设置Intent的处理有定制化修改,直接使用硬写字符串的android.settings.ACCESSIBILITY_SETTINGS可能无法打开正确页面,修复方案如下:
修复代码
this.btn_permission.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 使用官方Intent常量替代硬写字符串 Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); // 针对MIUI添加包名参数,引导至应用相关设置区域 intent.putExtra("package", context.getPackageName()); // 确保Intent可被解析,避免崩溃 if (intent.resolveActivity(context.getPackageManager()) != null) { startActivity(intent); } else { // 备选方案:打开应用信息页面,引导用户手动进入权限设置 Uri appUri = Uri.fromParts("package", context.getPackageName(), null); Intent appInfoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, appUri); startActivity(appInfoIntent); } } });
问题2:权限开启后无法识别
原代码通过读取Secure系统设置字段检测权限,MIUI可能修改了该字段的存储逻辑导致检测失效。应使用官方AccessibilityManagerAPI检测,同时修正UI操作的线程问题:
修复代码
- 替换权限检测方法
public static boolean isEnabled(Context context) { AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); // 获取所有已启用的无障碍服务 List<AccessibilityServiceInfo> enabledServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK); ComponentName targetService = new ComponentName(context, NotificationService.class); for (AccessibilityServiceInfo serviceInfo : enabledServices) { if (targetService.equals(serviceInfo.getResolveInfo().serviceInfo.componentName)) { return true; } } return false; }
- 修正TimerTask的线程问题(UI操作必须在主线程执行)
private Handler mainHandler = new Handler(Looper.getMainLooper()); public void timerStart() { this.timer.scheduleAtFixedRate(new TimerTask() { public void run() { if (isEnabled(Accessibility.this)) { Accessibility.this.timer.cancel(); // 切换到主线程执行页面跳转 mainHandler.post(() -> { Accessibility.this.finishAndRemoveTask(); startActivity(new Intent(Accessibility.this, MainActivity.class)); }); } } }, 0, 500); }
额外优化:替换轮询为设置监听
避免Timer轮询消耗资源,可通过ContentObserver监听无障碍设置变化:
private ContentObserver accessibilityObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... 其他初始化代码 accessibilityObserver = new ContentObserver(mainHandler) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); if (isEnabled(Accessibility.this)) { finishAndRemoveTask(); startActivity(new Intent(Accessibility.this, MainActivity.class)); getContentResolver().unregisterContentObserver(this); } } }; // 注册监听 getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES), true, accessibilityObserver ); } @Override protected void onDestroy() { super.onDestroy(); if (accessibilityObserver != null) { getContentResolver().unregisterContentObserver(accessibilityObserver); } if (timer != null) { timer.cancel(); } }
内容的提问来源于stack exchange,提问作者araraujo
相关产品推荐
相关产品推荐

