无法添加窗口 - 指定的窗口类型无效

时间:2016-08-10 16:47:47

标签: android android-view android-windowmanager

当我尝试使用WindowManager创建系统范围的叠加层并获得相应的权限时,我一直收到此异常:

 Unable to add window android.view.ViewRootImpl$W@6b3c898 -- the specified window type is not valid

我的代码(从我的关于创建的活动开始):

if(Build.VERSION.SDK_INT >= 23) {
            /** check if we already  have permission to draw over other apps */
            if (!Settings.canDrawOverlays(this)) {
                /** if not construct intent to request permission */
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getPackageName()));
                /** request permission via start activity for result */
                startActivityForResult(intent, CHECK_OVERLAY_PERMISSION_REQUEST_CODE);
            }
        }

if(Build.VERSION.SDK_INT >=23 && Settings.canDrawOverlays(this)) {
            WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                    PixelFormat.TRANSLUCENT
            );
            View overlay = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay_playback_controls, null);
            //overlay.setOnClickListener(this);

            windowManager.addView(overlay, layoutParams);
        }

如果需要,可以使用相应的xml-layout文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test!!!"
        />

</LinearLayout>

我已经尝试过这篇文章中的所有提示(包括链接的提示),但仍然不知道问题是什么:Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type

3 个答案:

答案 0 :(得分:1)

我自己找到了答案:

没有宽度和高度属性的视图不能存在,这就是为什么它没有运行。我根本不理解LayoutParams构造函数。

答案 1 :(得分:0)

我用这种方式解决了问题:

layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

我认为WindowManager.layoutParams必须有类型。

答案 2 :(得分:0)

  

此异常是从ViewRootImpl.class抛出的

原因是当您创建LayoutParams时,它必须是WindowManager.LayoutParams的实例,并且您必须设置正确的flgas。 构造函数参数不是宽度和高度,有某种标记。 否则你应该得到这个例外。 当Activity对象创建然后活动创建新的 PhoneWindow 对象时,它是窗口的子类。    PhoneWindow创建Window Manager。您可以通过从actvity调用 getWindowManager()来获取。

根视图由WindowManager创建;

第599行

  case WindowManagerGlobal.ADD_INVALID_TYPE:
                        throw new 
  WindowManager.InvalidDisplayException(
                                "Unable to add window " + mWindow
                                + " -- the specified window type is not 
  valid");
  

这是该例外的一个例子

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.word_detail_activity);

    TextView textView = new TextView(this);
    textView.setText("Hello");
    textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    textView.setBackgroundColor(Color.GRAY);

    WindowManager manager = getWindowManager();
    manager.addView(textView,new WindowManager.LayoutParams(-1,-1));
  

此代码正在运行,没有异常

    final  WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    params.format =  PixelFormat.TRANSLUCENT;
    params.gravity = Gravity.START | Gravity.TOP;
    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    params.packageName = getPackageName();

    WindowManager manager = getWindowManager();
    manager.addView(textView, params);