wake-up-neo.com

android.view.WindowManager $ BadTokenException: Fenster [email protected] kann nicht hinzugefügt werden - Berechtigung abgelehnt

Hier ist meine Stack-Spur:

01-30 15:11:41.037 13010-13010/project.app E/AndroidRuntime: FATAL EXCEPTION: main
 Process: project.app, PID: 13010
 Android.view.WindowManager$BadTokenException:
   Unable to add window [email protected] -- permission denied for window type 2003
   at Android.view.ViewRootImpl.setView(ViewRootImpl.Java:789)
   at Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.Java:356)
   at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:93)
   at Android.app.Dialog.show(Dialog.Java:330)
   at com.facebook.react.devsupport.DevSupportManagerImpl$4.run(DevSupportManagerImpl.Java:344)
   at Android.os.Handler.handleCallback(Handler.Java:790)
   at Android.os.Handler.dispatchMessage(Handler.Java:99)
   at Android.os.Looper.loop(Looper.Java:164)
   at Android.app.ActivityThread.main(ActivityThread.Java:6494)
   at Java.lang.reflect.Method.invoke(Native Method)
   at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:438)
   at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:807)

Ich habe eine Antwort gefunden, dass TYPE_SYSTEM_ERROR in Android Oreo (8) veraltet ist. Daher habe ich die folgende Methode implementiert, die ich auch gefunden habe:

public void fixAndroid() {
    WindowManager.LayoutParams params;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      params = new WindowManager.LayoutParams(
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
              WindowManager.LayoutParams.FLAG_FULLSCREEN,
              PixelFormat.TRANSLUCENT);
    } else {
      params = new WindowManager.LayoutParams(
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.MATCH_PARENT,
              WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
              WindowManager.LayoutParams.FLAG_FULLSCREEN,
              PixelFormat.TRANSLUCENT);
    }
  }

In meiner onCreate() Methode habe ich:

  @Override
  public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Checking permissions on init
    fixAndroid();
  }

Ich bekomme immer noch den Fehler.

Ich benutze Expo SDK 21, React Native 0.48. Die Anwendung wurde an ExpoKit abgetrennt. 

Nach jeder Änderung bereinige ich mein Projekt und führe es dann über Android Studio auf einem Emulator aus. 

Edit: Ich führe dies auf einem Nexus 5X-Emulator aus, der auf API 27 läuft.

12
Dan
TYPE_SYSTEM_ALERT

Diese Konstante wurde auf API-Ebene 26 für Nicht-System-Apps verworfen. Verwenden Sie stattdessen TYPE_APPLICATION_OVERLAY

1
Elad

Ich habe diesen Fehler vor einiger Zeit gesehen, als ich eine native & rea-app auf SDK 26 aktualisiert habe. Das Problem ist die reaktative Funktion, die den roten Dialog für die Entwicklung erstellt. Diese Funktionen verwenden TYPE_SYSTEM_ALERT als ihren Typ. Sie können also in Ihrer Hybrid-App mit dieser Version von Reaktiver keine SDK-Stufe größer als 25 verwenden, es sei denn, Sie aktualisieren diese Funktion, sodass TYPE_SYSTEM_ALERT nicht mehr verwendet wird. 

dies ist der reaktiöse Code in 0.48:

private void showNewError(
      final String message,
      final StackFrame[] stack,
      final int errorCookie,
      final ErrorType errorType) {
    UiThreadUtil.runOnUiThread(
        new Runnable() {
          @Override
          public void run() {
            if (mRedBoxDialog == null) {
              mRedBoxDialog = new RedBoxDialog(mApplicationContext, DevSupportManagerImpl.this, mRedBoxHandler);
              mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
            if (mRedBoxDialog.isShowing()) {
              // Sometimes errors cause multiple errors to be thrown in JS in quick succession. Only
              // show the first and most actionable one.
              return;
            }
            mRedBoxDialog.setExceptionDetails(message, stack);
            updateLastErrorInfo(message, stack, errorCookie, errorType);
            // Only report native errors here. JS errors are reported
            // inside {@link #updateJSError} after source mapping.
            if (mRedBoxHandler != null && errorType == ErrorType.NATIVE) {
              mRedBoxHandler.handleRedbox(message, stack, RedBoxHandler.ErrorType.NATIVE);
              mRedBoxDialog.resetReporting(true);
            } else {
              mRedBoxDialog.resetReporting(false);
            }
            mRedBoxDialog.show();
          }
        });
  } 

Sie müssten den Aufruf von mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);all auf einen anderen Typ ändern. Dies gibt Ihnen jedoch keine Garantie, dass Sie Ihre App mit SDK 26 ausführen können. Als ich versuchte, mit SDK 26 zu kompilieren, explodierten andere Teile des Projekts, sodass es unwahrscheinlich ist, dass dies kurzfristig funktioniert Begriff (Sie müssen möglicherweise andere Probleme beheben). Ihre Optionen sind also:

-Downgrade der App auf Stufe 25;

-Upgrade, um 0,52 zu reagieren, wo diese Funktion nicht mehr vorhanden ist, und erneut versuchen (Reaktivbibliotheken funktionieren danach möglicherweise nicht)

-Patch die Funktion im reaktionsnativen 0.48-Zweig und probiere die gepatchte Version. Einige andere Probleme im Zusammenhang mit dem SDK können auftreten (zu diesem Zeitpunkt reagieren wird noch mit SDK 22 kompiliert)

Viel Spaß beim Codieren!

0
Fco P.

Überprüfen Sie die SYSTEM_ALERT_WINDOW-Berechtigung, oder versuchen Sie, die Überlagerungsberechtigung manuell bereitzustellen.

Wie @Fco P. sagte, können Sie versuchen, sich zu ändern 

mRedBoxDialog.getWindow (). setType (WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

** ## Wenn Sie ein Lenovo-Gerät verwenden. Bitte versuchen Sie es mit einem anderen. Diese spezielle Berechtigung macht manchmal Probleme auf dem Lenovo-Gerät. ****

0
Dipendra Sharma