Android Studio 从辅助功能服务启动活动不适用于小米

dy1byipe  于 2023-06-24  发布在  Android
关注(0)|答案(1)|浏览(150)

我有一个无障碍服务,它必须打开一个活动时,一些条件是满足。
打开Activity的代码如下:

Intent intent = new Intent(WindowChangeDetectingService.this, OpenActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

我尝试过许多其他的标志,如FLAG_ACTIVITY_BROUGHT_TO_FRONTFLAG_ACTIVITY_REORDER_TO_FRONT,并将action设置为:ACTION_PICK_ACTIVITY,但它不会启动Activity。
我使用的是小米Mi9T,它不起作用,但一位同事使用华为,它确实对他有效,在模拟器(Pixel手机)上也有效。我该如何解决小米设备的问题?

rfbsl7qr

rfbsl7qr1#

**小米默认限制应用从后台启动活动。**您需要引导用户手动允许。(MIUI官方公告:https://www.xiaomi.cn/post/9216439

打开此Intent,让用户手动允许权限“在后台启动”:

intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");

如何知道用户是否已允许此权限?下面是从Internet中找到的一段代码:

public static boolean hasBackgroundStartPermissionInMIUI(Context context) {
        AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        try {
          // ops.checkOpNoThrow(op, uid, packageName)
          Field field = AppOpsManager.class.getField("OP_BACKGROUND_START_ACTIVITY");
          field.setAccessible(true);
          int opValue = (int) field.get(ops);
          Method method = ops.getClass().getMethod("checkOpNoThrow", int.class, int.class, String.class);
          Integer result = (Integer) method.invoke(ops, opValue, Process.myUid(), context.getPackageName());
          return result == AppOpsManager.MODE_ALLOWED;
        } catch (Exception e) {
          ProductionEnv.throwExceptForDebugging(e);
          return false;
        }
      }

此外,对于小米权限管理器中的其他权限。获取小米手机,查询AppOpsManager中声明的所有常量。然后将declaredFields替换为您想要的权限。

相关问题