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() ); } }
弹出悬浮窗口全过程
最新推荐文章于 2021-11-15 09:37:03 发布