【问题标题】:Android: Unable to add window. Permission denied for this window typeAndroid:无法添加窗口。此窗口类型的权限被拒绝
【发布时间】:2015-08-26 10:41:54
【问题描述】:

我正在开发一个应用程序,我需要在不解锁手机的情况下显示一个包含一些信息的窗口ON 锁定屏幕 (KeyGuard)。我想我可以使用WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG

但是每次我的应用程序崩溃并出现以下错误时:

android.view.WindowManager$BadTokenException: 无法添加窗口 android.view.ViewRootImpl$W@40ec8528 -- 权限被拒绝 窗口类型

这些帖子(hereherehere)都给出了相同的答案。 在 Manifest 文件中添加以下权限。

android.permission.SYSTEM_ALERT_WINDOW

我已经实施的解决方案,但我仍然遇到同样的错误。 知道我做错了什么吗?

这是我的清单文件中的权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />

这是我用来将窗口添加到锁定屏幕的代码

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mView = mInflater.inflate(R.layout.lock_screen_notif, null);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

    wm.addView(mView, params);

有人知道吗?

附:我正在运行 Android 4.4.2 的 HTC Desire 620 DS 上进行测试

【问题讨论】:

    标签: android android-windowmanager


    【解决方案1】:

    如果你使用apiLevel &gt;= 19,请不要使用

    WindowManager.LayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 
    

    得到以下错误:

    android.view.WindowManager$BadTokenException: 无法添加窗口 android.view.ViewRootImpl$W@40ec8528 -- 此窗口类型的权限被拒绝

    改用这个:

    LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL
    

    【讨论】:

    • 我的 TYPE_SYSTEM_ALERT 在 Android 5.1 上运行良好,并且在清单中授予了 android.permission.SYSTEM_ALERT_WINDOW
    • 我必须使用android.permission.SYSTEM_ALERT_WINDOWLayoutParams.TYPE_TOAST
    • 我试过 LayoutParams.TYPE_TOAST 。它在 Lollipop 和 Marshmallow 上都适用于 API 级别 6.0.1。在此之前,我使用的是 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT ,它仅适用于 Lollipop 。
    • 不幸的是,如果某些应用程序请求权限对话框(如果您的视图处于活动状态),它会导致“检测到屏幕覆盖”
    • 如果您试图从服务或广播接收器中显示窗口,这将不起作用
    【解决方案2】:

    我猜你应该区分目标(奥利奥之前和之后)

    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }
    
    params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        LAYOUT_FLAG,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);
    

    【讨论】:

    • 我正在尝试使用类似的技术,但 android studio 无法识别 Build.VERSION_CODES.OWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。我的 targetSdkVersion 是 26
    • 感谢您对我的帮助 +1。
    • @GabeO'Leary 我也面临同样的问题,你有解决方案吗?
    【解决方案3】:

    我尽我所能尝试了所有可用于此问题的示例。最后我得到了答案,我不知道它有多可靠,但我的应用程序现在没有崩溃。

    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
        //here is all the science of params
        final LayoutParams myParams = new LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                PixelFormat.TRANSLUCENT
        );
    

    在您的清单文件中,只需授予权限

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

    除此之外,您还可以检查 API 级别,如果其 >=23 则

     if(Build.VERSION.SDK_INT >= 23) {
        if (!Settings.canDrawOverlays(Activity.this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 1234);
        }
    }
                else
    {
        Intent intent = new Intent(Activity.this, Service.class);
        startService(intent);
    }
    

    我希望它可以帮助某个地方的人。 完整示例 https://anam-android-codes.blogspot.in/?m=1

    【讨论】:

      【解决方案4】:

      出于完全显而易见的原因,不允许普通应用在锁屏顶部创建任意窗口。如果我在你的锁屏上创建一个可以完美模仿真实锁屏的窗口,你认为我能做些什么,这样你就看不出区别了?

      您的错误的技术原因是使用了TYPE_KEYGUARD_DIALOG 标志 - 它需要android.permission.INTERNAL_SYSTEM_WINDOW 这是一个签名级别的权限。这意味着只有使用与权限创建者相同的证书签名的应用才能使用它。

      android.permission.INTERNAL_SYSTEM_WINDOW 的创建者是 Android 系统本身,所以除非你的应用是操作系统的一部分,否则你没有机会。

      notifying the user of information from the lockscreen 有定义明确且有据可查的方式。您可以创建显示在锁屏上的自定义通知,用户可以与之交互。

      【讨论】:

      • 就我个人而言,我一直在寻找类似 Facebook 应用程序的锁屏通知之类的东西。我已经知道新的锁屏通知,但这些目前仅适用于 Android 22。我需要一个适用于 Android 16 及更高版本的解决方案。但是您的回答非常有道理,我会接受它。我确实设法在锁定屏幕上显示一个窗口,但这不是我需要的,我将在下面发布我找到的解决方案。
      • 如果应用需要该权限,可以在安装并打开后授予。
      • 我认为自从奥利奥以来这是正确的答案stackoverflow.com/a/48481628/504179
      【解决方案5】:

      对于 8.0.0 的 Android API 级别,您应该使用

      WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
      

      而不是

      LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL
      

      SYSTEM_ALERT

      【讨论】:

      • TYPE_APPLICATION_OVERLAY 不在 Android Studio 中提供的选项列表中。我得到“无法解析符号类型”。我错过了什么?
      【解决方案6】:

      试试这段代码完美运行

      int layout_parms;
      
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
      
          {  
               layout_parms = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
      
          }
      
           else {
      
                  layout_parms = WindowManager.LayoutParams.TYPE_PHONE;
      
          }
      
          yourparams = new WindowManager.LayoutParams(       
                  WindowManager.LayoutParams.WRAP_CONTENT,
                  WindowManager.LayoutParams.WRAP_CONTENT,
                  layout_parms,
                  WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                  PixelFormat.TRANSLUCENT);
      

      【讨论】:

      • 你救了我的命
      • @BakaWaii 您想在其中显示小部件以将此代码放入其中会正常工作
      【解决方案7】:

      搜索

      在其他应用上绘图

      在您的设置中启用您的应用。 对于 Android 8 Oreo,请尝试

      设置 > 应用和通知 > 应用信息 > 显示在其他应用之上 > 启用

      【讨论】:

      • 你是救命稻草
      【解决方案8】:

      我刚刚通过以下步骤向WindowManager 添加了简单视图:

      1. 创建一个布局文件来显示(在我的例子中是 dummy_layout)
      2. 在清单中动态添加权限。
      // 1. Show view
      private void showCustomPopupMenu()
      {
          windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
          // LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          // View view = layoutInflater.inflate(R.layout.dummy_layout, null);
          ViewGroup valetModeWindow = (ViewGroup) View.inflate(this, R.layout.dummy_layout, null);
          int LAYOUT_FLAG;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
          } else {
              LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
          }
          WindowManager.LayoutParams params=new WindowManager.LayoutParams(
              WindowManager.LayoutParams.WRAP_CONTENT,
              WindowManager.LayoutParams.WRAP_CONTENT,
              LAYOUT_FLAG,
              WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
              PixelFormat.TRANSLUCENT);
      
          params.gravity= Gravity.CENTER|Gravity.CENTER;
          params.x=0;
          params.y=0;
          windowManager.addView(valetModeWindow, params);
      }
      
      // 2. Get permissions by asking
      if (!Settings.canDrawOverlays(this)) {
          Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
          startActivityForResult(intent, 1234);
      }
      

      有了这个,你可以添加一个视图到 WM。

      在 Pie 中测试。

      【讨论】:

      • 我已经使用了这个代码,但是当打开设置电话这个弹出隐藏?为什么?我该如何解决?
      【解决方案9】:

      首先你确保你有在清单文件中添加权限。

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

      检查应用是否有draw over其他应用的权限? 默认情况下,此权限适用于 API 23,您必须在运行时请求许可。

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
      
          Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                  Uri.parse("package:" + getPackageName()));
          startActivityForResult(intent, 1);
      } 
      

      使用此代码:

      public class ChatHeadService extends Service {
      
      private WindowManager mWindowManager;
      private View mChatHeadView;
      
      WindowManager.LayoutParams params;
      
      public ChatHeadService() {
      }
      
      @Override
      public IBinder onBind(Intent intent) {
          return null;
      }
      
      @Override
      public void onCreate() {
          super.onCreate();
      
          Language language = new Language();
          //Inflate the chat head layout we created
          mChatHeadView = LayoutInflater.from(this).inflate(R.layout.dialog_incoming_call, null);
      
      
          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
              params = new WindowManager.LayoutParams(
                      WindowManager.LayoutParams.WRAP_CONTENT,
                      WindowManager.LayoutParams.WRAP_CONTENT,
                      WindowManager.LayoutParams.TYPE_PHONE,
                      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                              | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                              | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                              | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                      PixelFormat.TRANSLUCENT);
      
              params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
              params.x = 0;
              params.y = 100;
              mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
              mWindowManager.addView(mChatHeadView, params);
      
          } else {
              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
                              | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                              | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                      PixelFormat.TRANSLUCENT);
      
      
              params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
              params.x = 0;
              params.y = 100;
              mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
              mWindowManager.addView(mChatHeadView, params);
          }
      
          TextView tvTitle=mChatHeadView.findViewById(R.id.tvTitle);
          tvTitle.setText("Incoming Call");
      
          //Set the close button.
          Button btnReject = (Button) mChatHeadView.findViewById(R.id.btnReject);
          btnReject.setText(language.getText(R.string.reject));
          btnReject.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  //close the service and remove the chat head from the window
                  stopSelf();
              }
          });
      
          //Drag and move chat head using user's touch action.
          final Button btnAccept = (Button) mChatHeadView.findViewById(R.id.btnAccept);
          btnAccept.setText(language.getText(R.string.accept));
      
      
          LinearLayout linearLayoutMain=mChatHeadView.findViewById(R.id.linearLayoutMain);
      
      
      
          linearLayoutMain.setOnTouchListener(new View.OnTouchListener() {
              private int lastAction;
              private int initialX;
              private int initialY;
              private float initialTouchX;
              private float initialTouchY;
      
              @Override
              public boolean onTouch(View v, MotionEvent event) {
                  switch (event.getAction()) {
                      case MotionEvent.ACTION_DOWN:
      
                          //remember the initial position.
                          initialX = params.x;
                          initialY = params.y;
      
                          //get the touch location
                          initialTouchX = event.getRawX();
                          initialTouchY = event.getRawY();
      
                          lastAction = event.getAction();
                          return true;
                      case MotionEvent.ACTION_UP:
                          //As we implemented on touch listener with ACTION_MOVE,
                          //we have to check if the previous action was ACTION_DOWN
                          //to identify if the user clicked the view or not.
                          if (lastAction == MotionEvent.ACTION_DOWN) {
                              //Open the chat conversation click.
                              Intent intent = new Intent(ChatHeadService.this, HomeActivity.class);
                              intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                              startActivity(intent);
      
                              //close the service and remove the chat heads
                              stopSelf();
                          }
                          lastAction = event.getAction();
                          return true;
                      case MotionEvent.ACTION_MOVE:
                          //Calculate the X and Y coordinates of the view.
                          params.x = initialX + (int) (event.getRawX() - initialTouchX);
                          params.y = initialY + (int) (event.getRawY() - initialTouchY);
      
                          //Update the layout with new X & Y coordinate
                          mWindowManager.updateViewLayout(mChatHeadView, params);
                          lastAction = event.getAction();
                          return true;
                  }
                  return false;
              }
          });
      }
      
      @Override
      public void onDestroy() {
          super.onDestroy();
          if (mChatHeadView != null) mWindowManager.removeView(mChatHeadView);
      }
      

      }

      【讨论】:

      • 你能分享你的 xml 代码并在 github 中查看或其他对我有帮助的东西。
      【解决方案10】:

      在您的项目中将您的标志 Windowmanger 标志“TYPE_SYSTEM_OVERLAY”更改为“TYPE_APPLICATION_OVERLAY”以与 Android O 兼容

      WindowManager.LayoutParams.TYPE_PHONEWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

      【讨论】:

        【解决方案11】:

        我确实设法最终使用TYPE_SYSTEM_OVERLAY而不是TYPE_KEYGUARD_DIALOG在锁定屏​​幕上显示一个窗口。这按预期工作,并在锁定屏幕上添加了窗口。

        这样做的问题是窗口被添加到所有可能的东西之上。也就是说,在安全锁定屏幕的情况下,窗口甚至会出现在您的键盘/图案锁的顶部.在不安全的锁定屏幕的情况下,如果您从锁定屏幕打开它,它将显示在通知托盘的顶部。

        对我来说,这是不可接受的。我希望这可以帮助其他面临这个问题的人。

        【讨论】:

        • 非常感谢您的解决方案。有没有办法解除它?当我将它添加为TYPE_SYSTEM_OVERLAY 时,我无法关闭该对话框。我在 AlertDialog 上的 setOnDismissListener 没有被调用。
        【解决方案12】:

        LayoutParams.TYPE_PHONE 已弃用。我已经像这样更新了我的代码。

        parameters = if (Build.VERSION.SDK_INT > 25) {
                LayoutParams(
                        minHW * 2 / 3, minHW * 2 / 3,
                        LayoutParams.TYPE_APPLICATION_OVERLAY,
                        LayoutParams.FLAG_NOT_FOCUSABLE,
                        PixelFormat.TRANSLUCENT)
            }else {
                LayoutParams(
                        minHW * 2 / 3, minHW * 2 / 3,
                        LayoutParams.TYPE_PHONE,
                        LayoutParams.FLAG_NOT_FOCUSABLE,
                        PixelFormat.TRANSLUCENT)
            }
        

        LayoutParams.TYPE_APPLICATION_OVERLAY 需要 api 级别 26 或以上。

        【讨论】:

          【解决方案13】:

          拒绝权限的主要原因是我们没有权限绘制其他应用程序,我们必须提供绘制其他应用程序的权限,可以通过以下代码完成

          权限请求代码

              public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
          

          将此添加到您的 MainActivity

          
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
                      askPermission();
          }
          
          
          
          private void askPermission() {
                  Intent intent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
                  startActivityForResult(intent,ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
          }
          
          

          也添加这个

              @RequiresApi(api = Build.VERSION_CODES.M)
              @Override
              protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
                  super.onActivityResult(requestCode, resultCode, data);
                  if(resultCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE){
                      if(!Settings.canDrawOverlays(this)){
                          askPermission();
                      }
                  }
              }
          
          

          【讨论】:

            【解决方案14】:

            我很难用ApplicationContextTYPE_SYSTEM_ALERT 找到有效的解决方案,并发现了令人困惑的解决方案,如果您希望从任何活动中打开对话框,即使对话框是单例,您也必须使用getApplicationContext(),并且如果想要对话框应该是TYPE_SYSTEM_ALERT,您将需要以下步骤:

            首先获取具有正确主题的对话框实例,您还需要像我在以下 sn-p 中所做的那样管理版本兼容性:

            AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat_Light);
            

            设置标题、消息和按钮后,您必须将对话框构建为:

            AlertDialog alert = builder.create();
            

            现在type在这里起主要作用,由于这是崩溃的原因,我处理了以下兼容性:

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);
            
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
            

            注意:如果您使用带有AppCompatDialog 的自定义对话框,如下所示:

            AppCompatDialog dialog = new AppCompatDialog(getApplicationContext(), R.style.Theme_AppCompat_Light);
            

            您可以直接将您的类型定义为AppCompatDialog 实例,如下所示:

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);
            
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
            

            不要忘记添加清单权限:

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

            【讨论】:

              【解决方案15】:
              if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                  WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                          WindowManager.LayoutParams.WRAP_CONTENT,
                          WindowManager.LayoutParams.WRAP_CONTENT,
                          WindowManager.LayoutParams.TYPE_PHONE,
                          WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                  | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                                  | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                                  | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                          PixelFormat.TRANSLUCENT);
              
                  params.gravity = Gravity.START | Gravity.TOP;
                  params.x = left;
                  params.y = top;
                  windowManager.addView(view, params);
              
              } else {
                  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
                                  | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                                  | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                          PixelFormat.TRANSLUCENT);
              
              
                  params.gravity = Gravity.START | Gravity.TOP;
                  params.x = left;
                  params.y = top;
                  windowManager.addView(view, params);
              }
              

              【讨论】:

                【解决方案16】:

                确保为操作系统版本 WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,因为它已被弃用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-18
                  • 1970-01-01
                  • 2019-02-03
                  • 1970-01-01
                  • 2018-07-09
                  • 2018-02-22
                  • 2023-02-09
                  相关资源
                  最近更新 更多