2016-08-10 3 views
0

ich diese Ausnahme immer empfangen, wenn ich versuche, eine systemweite Overlay erstellen Windowmanager und die entsprechende Erlaubnis verwendet:Unable Fenster hinzuzufügen - die angegebene Fenstertyp nicht gültig ist

Unable to add window [email protected] -- the specified window type is not valid 

My-Code (run aus meiner Tätigkeit 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); 
     } 

Und wenn nötig, heren die entsprechenden XML-Layout-Datei:

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

Ich habe bereits alle Hinweise von diesem Posten (einschließlich der verknüpften eins) versucht, aber haben noch keine Ahnung, was das Problem ist: Unable to add window [email protected] -- permission denied for this window type

+0

Seltsam. Mit nur einer geringfügigen Änderung (Hinzufügen eines endgültigen statischen int CHECK_OVERLAY_PERMISSION_REQUEST_CODE) konnte ich dies ohne Probleme ausführen lassen. In welcher Version von Android und/oder welchem ​​Gerät/Emulator verwendest du das? Außerdem, welche sdk-Version targetieren und kompilieren Sie gegen? –

+0

Noch interessanter, dass Sie es geschafft haben, es laufen zu lassen.Ich habe einfach die Konstante int beim Kopieren des Codes vergessen. Aber ich konnte es zum Laufen bringen. Ich habe mich auf Berechtigungen konzentriert, weil ich gelesen habe, dass dieser Fehler dadurch erzeugt wird, aber ich habe einfach vergessen, eine "Höhe" für das Layout zu implementieren, so dass es nicht ausgeführt wird, weil eine Ansicht ohne Breiten- und Höhenparameter nicht möglich ist. –

Antwort

1

ich die Antwort selbst gefunden:

Eine Ansicht ohne Breite und Höhe Attribute können nicht existieren, deshalb ist es nicht gelaufen. Ich habe den LayoutParams-Konstruktor einfach nicht verstanden.

0

ich das Problem auf diese Weise gelöst:

layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 

Ich denke WindowManager.layoutParams einen Typ haben muss.

0

wurde diese Ausnahme von ViewRootImpl.class

geworfen

Der Grund dafür ist, wenn Sie erstellen LayoutParams seine Instanz von WindowManager.LayoutParams sein muss, und Sie müssen richtig flgas gesetzt. Konstruktor Parameter ist nicht Breite und Höhe, es gibt eine Art von Flags. Andernfalls sollten Sie diese Ausnahme erhalten. Wenn das Aktivitätsobjekt erstellt und dann die Aktivität neu erstellt wird PhoneWindow Objekt, das die Kindklasse des Fensters ist. Diese Klasse ist SDK nicht enthalten, aber PhoneWindow erstellen Window Manager. Sie können durch Aufruf von getWindowManager() von activity kommen.

Root-Ansicht wurde von WindowManager erstellt;

Leitung 599

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

Dies ist ein Beispiel für diese Ausnahme

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

Dieser Code ohne

Exception ausgeführt wird
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); 
Verwandte Themen