0

I keep receiving this exception, when i try to create a system wide overlay using a WindowManager and the corresponding permission:

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

My Code (run from my activities onCreate):

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);
        }

And if needed, heres the corresponding xml-layout file:

<?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>

I have already tried all hints from this post (including the linked one), but still have no idea what the problem is: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type

Community
  • 1
  • 1
Rico Chr.
  • 131
  • 1
  • 9
  • Strange. With only a slight modification (adding a final static int CHECK_OVERLAY_PERMISSION_REQUEST_CODE) I was able to get this to execute with no issue. What version of Android and/or which device/emulator are you using to test this on? Also, what sdk version are you targeting and compiling against? – Bryan Dunlap Aug 10 '16 at 17:40
  • Even more interesting, that you managed to make it run. I simply forgot the constant int when copying the code. But I was able to make it run. I was focusing on permissions because i read that this error is produced by that, but i simply forgot to introduce a "height" for the layoutparams, so it wont run because a view without width and height parameters is not possible. – Rico Chr. Aug 10 '16 at 17:43

3 Answers3

1

I found the answer myself:

A View without width and height attributes cannot exist, so thats why it didn't run. I simply didn't understand the LayoutParams constructor.

Rico Chr.
  • 131
  • 1
  • 9
1

I solved the problem in this way:

layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

I think WindowManager.layoutParams must have a type.

Martin Tournoij
  • 26,737
  • 24
  • 105
  • 146
0

This Exception was thrown from ViewRootImpl.class

The reason is when you create LayoutParams its must be instance of WindowManager.LayoutParams, and you must set correct flgas. Constructor params is not width and height, there are some kind of flags. Otherwise you should get this exception. When Activity object created and then activity create new PhoneWindow object which is child class of window. PhoneWindow create Window Manager. You can get in by calling getWindowManager() from actvity.

Root view was created by WindowManager;

line 599

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

This is an example of that Exception

@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));

This code is running without Exception

    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);
Vahe Gharibyan
  • 5,277
  • 4
  • 36
  • 47