ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – Settings.canDrawOverlays即使在从设置中启用权限后返回false

2019-08-28 21:24:45  阅读:745  来源: 互联网

标签:android overlay system-alert-window


我正在尝试从this回答浪潮代码检查是否启用了权限.但即使从设置启用了权限,它也会返回false.

public static boolean canDrawOverlayViews(Context con){
    if(Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP){return true;}
    try {
        return Settings.canDrawOverlays(con);
    }
    catch(NoSuchMethodError e){
        return canDrawOverlaysUsingReflection(con);
    }
}


public static boolean canDrawOverlaysUsingReflection(Context context) {

    try {

        AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        Class clazz = AppOpsManager.class;
        Method dispatchMethod = clazz.getMethod("checkOp", new Class[] { int.class, int.class, String.class });
        //AppOpsManager.OP_SYSTEM_ALERT_WINDOW = 24
        int mode = (Integer) dispatchMethod.invoke(manager, new Object[] { 24, Binder.getCallingUid(), context.getApplicationContext().getPackageName() });

        return AppOpsManager.MODE_ALLOWED == mode;

    } catch (Exception e) {  return false;  }

}

解决方法:

最近我也遇到了同样的问题并得到了以下解决方法.
参考
https://code.google.com/p/android/issues/detail?id=198671#c7

public boolean getWindoOverLayAddedOrNot2() {

   String sClassName = "android.provider.Settings";
   try {
       Class classToInvestigate = Class.forName(sClassName);
       if (context == null)
           context = activity;
       Method method = classToInvestigate.getDeclaredMethod("isCallingPackageAllowedToDrawOverlays", Context.class, int.class, String.class, boolean.class);
       Object value = method.invoke(null, context, Process.myUid(), context.getPackageName(), false);

       Log.i("Tag", value.toString());
       // Dynamically do stuff with this class
       // List constructors, fields, methods, etc.

   } catch (ClassNotFoundException e) {
       // Class not found!
   } catch (Exception e) {
       // Unknown exception
       e.printStackTrace();
   }

   return false;
}

标签:android,overlay,system-alert-window
来源: https://codeday.me/bug/20190828/1755847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有