【问题标题】:how to check display popup window (WindowManager) permission in MIUI?如何检查 MIUI 中的显示弹出窗口(WindowManager)权限?
【发布时间】:2016-11-23 18:39:01
【问题描述】:

我想检查WindowManager 权限是否已授予。 我得到了 MIUI from here 重定向到用户权限 activity 的解决方案。

我正在检查 WindowManager 权限,但它在这一行抛出 java.lang.IllegalArgumentException: Unknown operation string: android:system_alert_window

final int mode = manager.checkOp(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW, Binder.getCallingUid(), context.getPackageName());

  @SuppressLint("NewApi")
public static boolean isFloatWindowOpAllowed(Context context) {

        if (Build.VERSION.SDK_INT >= 19) { // 19, 4.4, KITKAT

            final AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            final int mode = manager.checkOp(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW,
                    Binder.getCallingUid(), context.getPackageName());
            return AppOpsManager.MODE_ALLOWED == mode;
        } else {
            return (context.getApplicationInfo().flags & 1 << 27) == 1;
        }

}

错误日志:

08-23 18:18:25.733: W/System.err(23108): java.lang.IllegalArgumentException: Unknown operation string: android:system_alert_window
08-23 18:18:25.733: W/System.err(23108):    at android.app.AppOpsManager.strOpToOp(AppOpsManager.java:1624)
08-23 18:18:25.733: W/System.err(23108):    at android.app.AppOpsManager.checkOp(AppOpsManager.java:1646)
08-23 18:18:25.733: W/System.err(23108):    at com.windowmanager.demo.util.MIUIUtils.isFloatWindowOpAllowed(MIUIUtils.java:73)
08-23 18:18:25.733: W/System.err(23108):    at com.windowmanager.demo.compat.WindowManagerPermissionCompat$MIUIRomCompatImpl.hasFloatWindowPermission(WindowManagerPermissionCompat.java:163)
08-23 18:18:25.733: W/System.err(23108):    at com.windowmanager.demo.compat.WindowManagerPermissionCompat.hasFloatWindowPermission(WindowManagerPermissionCompat.java:198)
08-23 18:18:25.733: W/System.err(23108):    at com.windowmanager.demo.addons.settings.WindowManagerActivity.onCreate(WindowManagerActivity.java:92)
08-23 18:18:25.733: W/System.err(23108):    at android.app.Activity.performCreate(Activity.java:6041)
08-23 18:18:25.733: W/System.err(23108):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1109)
08-23 18:18:25.733: W/System.err(23108):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2285)
08-23 18:18:25.733: W/System.err(23108):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2394)
08-23 18:18:25.733: W/System.err(23108):    at android.app.ActivityThread.access$800(ActivityThread.java:154)
08-23 18:18:25.733: W/System.err(23108):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
08-23 18:18:25.733: W/System.err(23108):    at android.os.Handler.dispatchMessage(Handler.java:102)
08-23 18:18:25.733: W/System.err(23108):    at android.os.Looper.loop(Looper.java:135)
08-23 18:18:25.733: W/System.err(23108):    at android.app.ActivityThread.main(ActivityThread.java:5276)
08-23 18:18:25.733: W/System.err(23108):    at java.lang.reflect.Method.invoke(Native Method)
08-23 18:18:25.733: W/System.err(23108):    at java.lang.reflect.Method.invoke(Method.java:372)
08-23 18:18:25.733: W/System.err(23108):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
08-23 18:18:25.733: W/System.err(23108):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

【问题讨论】:

    标签: android user-permissions android-windowmanager


    【解决方案1】:

    我认为在这种情况下你需要使用 checkOp(int op, int uid, String packageName) 而不是 checkOp(String op, int uid, String packageName) 但是我不认为 checkOp(int,int,String) 是不可访问的。您必须使用反射来调用此方法。

    AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    Class localClass = manager.getClass();
    Class[] arrayOfClass = new Class[3];
    arrayOfClass[0] = Integer.TYPE;
    arrayOfClass[1] = Integer.TYPE;
    arrayOfClass[2] = String.class;
    try {
        Method method = localClass.getMethod("checkOp", arrayOfClass);
        if (method == null) {
            return false;
        }
        Object[] arrayOfObjects = new Object[3];
        arrayOfObjects[0] = Integer.valueOf(24);
        arrayOfObjects[1] = Integer.valueOf(Binder.getCallingUid());
        arrayOfObjects[2] = context.getPackageName();
        int m = ((Integer) method.invoke((Object) manager, arrayOfObjects)).intValue();
        return m == AppOpsManager.MODE_ALLOWED;
    }catch (Exception e){
        return false;
    }
    

    OPINT 24 用于 SYSTEM_ALERT_WINDOW

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多