2016-07-20 6 views
1

WindowManagerの許可を確認するかどうかを確認します。 MIUI from hereのユーザー許可activityにリダイレクトするソリューションがあります。MIUIの表示ポップアップウィンドウ(WindowManager)権限をチェックする方法は?

私はWindowManager許可をチェックしていますが、それはjava.lang.IllegalArgumentExceptionがスローです:不明な操作文字列:アンドロイド:system_alert_windowこのラインで

最終int型モード= manager.checkOp(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW、 バインダーを.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) 

答えて

0

私がint、String型のオペアンプ(このケースでは、あなたが代わりにcheckOpのcheckOp(int型オペアンプ、int型のuid、文字列のpackageName)を使用する必要があると思います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

のためであります
関連する問題