android禁止悬浮弹窗,Android 检测手机是不是允许弹出悬浮窗

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

/**

* 检测当前是否可以显示悬浮窗(与是否有悬浮窗权限有一定区别 华为手机当有activity存在时,无论是否有权限都允许弹出悬浮窗。)

* @param context

* @param result {@link }

* @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中使用,否则无法检测。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 中实现弹窗悬浮窗之下或者弹窗在新弹出弹窗之下,您可以使用 WindowManager.LayoutParams 类的 flags 属性来设置窗口类型。 1. 弹窗悬浮窗之下 如果您希望弹窗位于悬浮窗之下,您可以将 WindowManager.LayoutParams 类的 flags 属性设置为 FLAG_NOT_FOCUSABLE 和 FLAG_NOT_TOUCH_MODAL。 ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); ``` 2. 弹窗在新弹出弹窗之下 如果您希望弹窗位于新弹出弹窗之下,您可以将 WindowManager.LayoutParams 类的 flags 属性设置为 FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCH_MODAL 和 FLAG_WATCH_OUTSIDE_TOUCH。 ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); ``` 在这种情况下,您需要在弹出弹窗中添加 FLAG_NOT_FOCUSABLE 和 FLAG_NOT_TOUCH_MODAL 标志,以确保它们不会干扰您的弹窗。例如: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); ``` 注意:使用 WindowManager.LayoutParams 类的 flags 属性需要您的应用程序具有 SYSTEM_ALERT_WINDOW 权限。为了避免安全风险,您需要在 Android 6.0 及更高版本中请求此权限,并且用户必须授予此权限才能使用该功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值