WindowManager视图添加不显示——悬浮窗的权限适配问题

WindowManager视图添加不显示——悬浮窗的权限适配问题

悬浮窗适配方案

目前市场上有两种方式,第一种是正规流程,系统在没有赋予APP悬浮窗权限,会先跳转到权限授权界面,引导用户开启悬浮窗权限,然后再去弹相应悬浮窗,比如QQ一些主流应用这样做;第二种就是利用系统的漏洞,绕过权限申请,该方法不提倡,比如UC就是这样做,不过在一些特殊机型不行,比如miui8.

正常适配流程

Android6.0之前版本

由于google没有对这个权限进行单独处理,到时不同手机厂家各自定制不同授权界面,到时适配难度增加。具体解决方案,之前看过一位博主解决方案,目前最详细,这篇博客文章Android 悬浮窗权限各机型各系统适配大全。主要适配的机子有一下几个手机厂家:小米、华为、oppo、魅族、360。详情可以直接通过该链接查阅,博主讲解很详细。

Android6.0及之后版本

google后面对权限问题进行严格控制,悬浮窗权限在6.0以及之后版本开始单独拿出来管理。
首先,我们必须在Mainfest静态申请权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

然后再判断是否被授权,程序安装默认情况下是没有授权的。下面是是否授权代码

private boolean permissionCheck(Context context) {
    Boolean result = true;
    if (Build.VERSION.SDK_INT >= 23) {
        try {
            Class clazz = Settings.class;
            Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class);
            result = (Boolean) canDrawOverlays.invoke(null, context);
        } catch (Exception e) {
            Log.e(TAG, Log.getStackTraceString(e));
        }
    }
    return result;
}

所以要动态申请,引导用户到相应的授权界面去授权悬浮窗的权限给APP。

    public static void permissionApplyInternal(Context context) throws NoSuchFieldException, IllegalAccessException {
        Class clazz = Settings.class;
        Field field = clazz.getDeclaredField("ACTION_MANAGE_OVERLAY_PERMISSION");

        Intent intent = new Intent(field.get(null).toString());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 Android 悬浮窗的实现,可以使用 WindowManager 来实现。但是在实现过程中,可能会遇到 WindowManager 无法传递事件的问题。 这个问题的原因可能是因为 WindowManager 的类型不正确。在创建 WindowManager 的时候,需要指定正确的类型,例如 TYPE_APPLICATION_OVERLAY 类型。 下面是一个基本的悬浮窗实现示例: ```java public class FloatingWindowService extends Service { private WindowManager mWindowManager; private View mFloatingView; public FloatingWindowService() { } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); // 创建一个 WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 创建一个悬浮窗 View mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null); // 设置悬浮窗的类型为 TYPE_APPLICATION_OVERLAY WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); // 将悬浮窗添加WindowManager 中 mWindowManager.addView(mFloatingView, params); } @Override public void onDestroy() { super.onDestroy(); if (mFloatingView != null) { // 从 WindowManager 中移除悬浮窗 mWindowManager.removeView(mFloatingView); } } } ``` 在这个示例中,我们通过创建一个 WindowManager,并将悬浮窗 View 添加WindowManager 中来实现悬浮窗。同时,我们还需要设置悬浮窗的类型为 TYPE_APPLICATION_OVERLAY 类型,以确保能够正常接收事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值