我有一个无障碍服务,它必须在满足某些条件时打开一项 Activity 。
打开 Activity 的代码是这样的:
Intent intent = new Intent(WindowChangeDetectingService.this, OpenActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
我尝试了许多其他标志,例如 FLAG_ACTIVITY_BROUGHT_TO_FRONT
或 FLAG_ACTIVITY_REORDER_TO_FRONT
,并将操作设置为:ACTION_PICK_ACTIVITY
,但它不会启动 Activity 。我用的是小米9T,不行,同事用的是华为,对他有用,在模拟器(Pixel手机)上也可以。如何为小米设备解决此问题?
最佳答案
小米通过以下方式限制应用程序从后台启动 Activity
默认。 您必须引导用户手动允许它。 (官方的
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
获得您想要的许可。
关于android - 从无障碍服务启动 Activity 不适用于小米,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67245527/