Android在lib库提供的activity界面之上显示悬浮框

悬浮框实现参考:https://blog.csdn.net/baidu_34928905/article/details/102683404

需求描述:在视频会议界面,开启lib库提供的白板界面,要在lib库的白板activity上显示本应用的悬浮框

遇到的问题1,不好控制悬浮框的显示与隐藏,因为涉及到lib库的activity,之前是想监听按键home和menu键实现隐藏,没实现

解决技巧:在Application中注册对activity的生命周期的监听,在lib库activity的onStart和onStop中通过EventBus发送事件,通知给视频会议activity处理悬浮框的隐藏和显示

遇到的问题2,悬浮框权限如果到白板界面后再申请,视频会议界面会收不到onActivityResult的回调

解决方法:在点击共享白板的时候申请权限,权限通过了开启白板,未通过则toast提示

遇到的问题3:在白板界面返回键失效

解决方法:在设置WIndowMananger参数时,按顺序添加以下flag
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//不耽误其他事件
layoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 

解决:

1.添加权限

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

2.相关函数方法

public void showFloat(){

if (commonROMPermissionCheck(MainActivity.this)) {
      showFloatingWindow()
    } else {
        requestAlertWindowPermission();
    }

}
    //申请权限,跳转到系统的权限申请界面
    private void requestAlertWindowPermission() {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    //处理回调
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(this)) {
                    Log.i(TAG, "onActivityResult granted");
                    showFloat();
                } else {
                    Log.i(TAG, "onActivityResult noGranted!");
                }
            }
        }
    }

private void showFloatingWindow() {
    if (Settings.canDrawOverlays(this)) {
        // 获取WindowManager服务
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        // 新建悬浮窗控件
        Button button = new Button(getApplicationContext());
        button.setText("Floating Window");
        button.setBackgroundColor(Color.BLUE);

        // 设置LayoutParam
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        }
        layoutParams.format = PixelFormat.RGBA_8888;
        layoutParams.width = 500;
        layoutParams.height = 100;
        layoutParams.x = 300;
        layoutParams.y = 300;

        // 将悬浮窗控件添加到WindowManager
        windowManager.addView(button, layoutParams);
    }
}

private void showFloatingWindow() {
    if (Settings.canDrawOverlays(this)) {
        // 获取WindowManager服务
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        // 新建悬浮窗控件
        Button button = new Button(getApplicationContext());
        button.setText("Floating Window");
        button.setBackgroundColor(Color.BLUE);

        // 设置LayoutParam
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        }

layoutParams .flags =
/ /可使用FLAG_DISMISS_KEYGUARD选项直接解除非加锁的锁屏状态。此选项只用于最顶层的全屏幕窗口。
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL   //必须  设置窗口不拦截窗口范围之外事件
                    
                         |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH  // 必须  设置在有FLAG_NOT_TOUCH_MODAL属性时,窗口之外事件发生时自己也获取事件

                        | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;

        layoutParams.format = PixelFormat.RGBA_8888;
        layoutParams.width = 500;
        layoutParams.height = 100;
        layoutParams.x = 300;
        layoutParams.y = 300;

        // 将悬浮窗控件添加到WindowManager
        windowManager.addView(button, layoutParams);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值