web-dev-qa-db-fra.com

android.view.WindowManager $ BadTokenException: impossible d'ajouter la fenêtre Android.view.ViewRootImpl$W@c745883 - autorisation refusée

Voici ma trace de pile:

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 Android.view.ViewRootImpl$W@c745883 -- 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)

J'ai trouvé une réponse sur le fait que TYPE_SYSTEM_ERROR soit obsolète dans Android Oreo (8). J'ai donc implémenté la méthode suivante que j'ai également trouvée:

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

Dans ma méthode onCreate(), j'ai:

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

J'ai toujours l'erreur.

J'utilise Expo SDK 21, React Native 0.48. L'application a été détachée dans ExpoKit. 

Après chaque modification, je nettoie mon projet, puis je l'exécute sur un émulateur via Android Studio. 

Edit: Je l’utilise sur un émulateur Nexus 5X, fonctionnant sur l’API 27.

12
Dan
TYPE_SYSTEM_ALERT

Cette constante était déconseillée dans l'API de niveau 26. pour les applications non-système. Utilisez TYPE_APPLICATION_OVERLAY à la place. 

1
Elad

J'ai vu cette erreur il y a quelque temps, lorsque j'ai mis à jour une application native & react en SDK 26. Le problème est la fonction react-native qui crée le dialogue rouge pour le développement. Cette fonction utilise TYPE_SYSTEM_ALERT comme type. Par conséquent, vous ne pouvez pas utiliser un niveau de SDK supérieur à 25 dans votre application hybride avec cette version de react-native, à moins que vous ne corrigiez cette fonction afin qu'elle n'utilise plus TYPE_SYSTEM_ALERT. 

c'est le code réactif natif dans 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();
          }
        });
  } 

Vous auriez besoin de changer le mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);call en un autre type. Cependant, cela ne vous donne aucune garantie que vous pourrez exécuter votre application avec le SDK 26; lorsque j'ai essayé de compiler Réagir avec le SDK 26, d'autres parties du projet ont "réagi" et ont donc explosé. Il est donc peu probable que cela fonctionne. terme (vous devrez peut-être commencer à résoudre d’autres problèmes). Donc, vos options sont:

- Dégradé l'application au niveau 25;

-Upgrade to react 0.52, où cette fonction n'existe plus, puis réessayez (les bibliothèques de réaction risquent de ne plus fonctionner).

-Patch la fonction dans la branche 0.48 réactif natif et essayez la version corrigée. D'autres problèmes liés au SDK peuvent survenir (la réaction à ce stade est toujours en cours de compilation avec le SDK 22)

Bonne codage!

0
Fco P.

Vérifiez l'autorisation SYSTEM_ALERT_WINDOW ou essayez de fournir l'autorisation de superposition manuellement.

Comme @Fco P. a dit que vous pouvez essayer de changer 

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

** ## Si vous utilisez un périphérique Lenovo. S'il vous plaît essayer avec un autre. Cette autorisation particulière pose problème à un moment sur un périphérique Lenovo. ****

0
Dipendra Sharma