弹出悬浮窗口全过程

    void doShowDesktop(Context Ctx ,int  viewLayoutId){
        try{
            /*
            * 申请常规权限
            * */
            String[] permissionManifest = {
                    Manifest.permission.SYSTEM_ALERT_WINDOW,
                    Manifest.permission.INTERNET,
                    Manifest.permission.CAMERA,
                    Manifest.permission.BLUETOOTH,
                    Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            };
            for (int i = 0; i < permissionManifest.length; i++) {
                String permission = permissionManifest[i];
                int mNoPermissionIndex = i;
                boolean hasPermissionFlag = PermissionChecker.checkSelfPermission(Ctx, permission) == (int) PackageManager.PERMISSION_GRANTED;
                if (!hasPermissionFlag) {
                    ActivityCompat.requestPermissions((Activity)Ctx , new String[]{permission}, 1);
                }
            }
            /*
            * 申请窗口置顶 (悬浮窗口) 的权限
            * */
            boolean aFlag = FloatWindowManager.getInstance().applyFloatWindow(Ctx);
            if( aFlag ){
                boolean aFlag1 = Settings.canDrawOverlays(Ctx);
                if( aFlag1 ){
                    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                            Uri.parse("package:" + Ctx.getPackageName()));
                    ((Activity) (Ctx)).startActivityForResult(intent,10);
                }
                /*
                * 申请捕捉窗口画面的权限
                * */
                MediaProjectionManager mediaProjectionManager = (MediaProjectionManager)
                        ((Activity)(Ctx)).getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
                if( mediaProjectionManager!=null) {
                    final Context mCtx = Ctx;
                    try {
                        ((Activity) (Ctx)).startActivityForResult(
                                mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE
                        );
                    } catch (ActivityNotFoundException ex) {
                        ex.printStackTrace();
                        ((Activity) (Ctx)).runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(((Activity) (mCtx)).getApplicationContext()
                                        , "Start ScreenRecording failed, current device is NOT suuported!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
                else {
                    Toast.makeText(Ctx, "录屏需要5.0版本以上", Toast.LENGTH_LONG).show();
                }
                /*
                 * 创建并打开悬浮窗口
                 * */
                View mView =  LayoutInflater.from( mRoot.getContext() ).inflate(viewLayoutId,null);
                /*
                创建窗口参数,设置窗口属性
                 */
                WindowManager.LayoutParams param = new WindowManager.LayoutParams();
                try{
                    // 设置窗口属性
                    int aType = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
                    if ( Build.VERSION.SDK_INT>=27){
                        aType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
                    }

                    //param.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;       // 设置为系统警告窗, 可以悬浮在其他应用之上
                    param.type = aType;       // 设置为系统警告窗, 可以悬浮在其他应用之上
                    param.format = PixelFormat.TRANSLUCENT;                          // 支持透明
                    param.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN   // 可在全屏幕布局, 不受状态栏影响
                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;         // 最初不可获取焦点, 这样不影响底层应用接收触摸事件
                    param.alpha = 0.9f;                                              // 悬浮窗的透明度
                    param.gravity = Gravity.LEFT | Gravity.TOP;                      // 悬浮窗的重力效果
                    param.width = WindowManager.LayoutParams.WRAP_CONTENT;           // 悬浮窗宽度
                    param.height = WindowManager.LayoutParams.WRAP_CONTENT;          // 悬浮窗高度
                    param.x = 50;
                    param.y = 30;
// 以下将悬浮穿定位在屏幕中央
                    //int screenWidth = mWindowManager.getDefaultDisplay().getWidth();
                    //int screenHeight = mWindowManager.getDefaultDisplay().getHeight();
                    //param.x = (screenWidth - param.width) / 2;
                    //param.y = (screenHeight - param.height) / 2;

                }
                catch (Exception er){
                    Log.e(TAG, er.getMessage() );
                }
                WindowManager mWindowManager = (WindowManager) Ctx.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                mWindowManager.addView(mView , param);
                mView.findViewById(R.id.txtToolStart).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        doOnFloatBtn(view);
                    }
                });
                mView.findViewById(R.id.txtToolStop).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        doOnFloatBtn(view);
                    }
                });
                mView.findViewById(R.id.txtToolclose).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        doOnFloatBtn(view);
                    }
                });
                ((Activity)(Ctx)).finish();
            }
        }
        catch (Exception er){
            Log.e(TAG, "doPush: "+er.getMessage() );
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值