当前位置: 代码迷 >> Android >> Android 检测手机是不是允许弹出悬浮窗
  详细解决方案

Android 检测手机是不是允许弹出悬浮窗

热度:100   发布时间:2016-04-27 22:04:43.0
Android 检测手机是否允许弹出悬浮窗

? 如今手机大多数都是用各个厂商定制的ROM,大部分Rom都添加了是否允许弹出悬浮窗的权限(小米,魅族,乐视等等)。这里提供一个方法来让app自己检查自己是否允许弹出悬浮窗。代码为了独立舍弃了一些优化方法,大家可以自行根据情况修改。

    /**     * 检测当前是否可以显示悬浮窗(与是否有悬浮窗权限有一定区别 华为手机当有activity存在时,无论是否有权限都允许弹出悬浮窗。)     * @param context     * @param result [email protected] }     * @return true 开始检测  false检测失败     */    public static boolean checkFloatWindowAllowShow(Context context,final ICheckResult result){        final WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);        if(windowManager == null){            return false;        }        WindowManager.LayoutParams params = new WindowManager.LayoutParams();        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;        params.width = 0;        params.height = 0;        final Handler handler = new Handler();        final View view = new View(context){            @Override            public void onWindowFocusChanged(boolean hasWindowFocus) {                handler.removeCallbacksAndMessages(null);                if(getParent() != null) {                    windowManager.removeView(this);                }                //允许弹出悬浮窗                result.onResult(true);            }        };        windowManager.addView(view, params);        handler.postDelayed(new Runnable() {            @Override            public void run() {                windowManager.removeView(view);                handler.removeCallbacksAndMessages(null);                //禁止弹出悬浮窗                result.onResult(false);            }        }, 100);        return true;    }    /**     * 用于反馈检查结果     */    public interface ICheckResult{        void onResult(boolean isAllow);    }

?这个方法可以解决绝大部分手机ROM的检测问题(本地测试5款常见手机,都可以检测)。不过注意一点,华为手机因为他的悬浮窗权限比较特殊,当app由activity在前台时,无论是否拥有权限,华为均可弹出悬浮窗。所以要完美检测当前是否有权限,需要在前台没有activity时调用,例如在service中使用,否则无法检测。

  相关解决方案