2016-07-19 6 views
15

私はこの例外の理由をしばらく見つけ出すのに苦労しましたが、自分自身を再現することはできませんでしたが、それ。これはAndroid 6.0.1でのみ発生し、SDK自体の中でクラッシュが発生して以来、どのように起こっているか把握するのは非常に難しいです。この問題に関する不正なトークン例外 - ウィンドウを追加できません(Marshmallow - フローティングツールバー)

他のソリューションのような、助けていない:私はDialogFragmentsとAlertDialogsを使用しています

window manager bad token exception

"android.view.WindowManager$BadTokenException: Unable to add window" on buider.show()

、「私はそれがコア問題になることができると思いますが、それはちょうどdoesnのそれはマーシュマローのユーザーにのみ影響を与えるので、追加してください。

Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
     at android.view.ViewRootImpl.setView(ViewRootImpl.java:849) 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:337) 
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
     at android.widget.PopupWindow.invokePopup(PopupWindow.java:1329) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1077) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1035) 
     at com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup.show(FloatingToolbar.java:561) 
     at com.android.internal.widget.FloatingToolbar.show(FloatingToolbar.java:212) 
     at com.android.internal.view.FloatingActionMode$FloatingToolbarVisibilityHelper.updateToolbarVisibility(FloatingActionMode.java:411) 
     at com.android.internal.view.FloatingActionMode$1.run(FloatingActionMode.java:65) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:158) 
     at android.app.ActivityThread.main(ActivityThread.java:7224) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+0

アプリが稼働している場合は、この問題を直ちに解決する必要があります。キャッチが黙って失敗するtry/catchでエラーとサラウンドをローカライズします。これはアプリクラッシュの10倍です。なぜ私はこれが起こっているのかわからないので、私はあまり役に立たない、私は残念ですが、私は一般的なアドバイスの一部を提供しています。 – Vucko

+0

私は完全に同意します。しかし、stacktraceが実際にどこにポインタを置いてくれるわけではないので、現地化の部分は難しいです。私はちょうどここに誰かが私の調査を楽にすることができる原因を知るかもしれないことを期待しています –

+0

stacktraceはアクションモードについて話しています。ユーザーがツールバーにアクションモードを表示するにはどうすればよいですか?何か変わったことがあるかもしれません。ユーザーはどこかでテキストを選択できますが、ユーザーのタッチでも新しいアクティビティが呼び出される可能性があるため、選択と新しいアクティビティが同時に発生します。 –

答えて

19

この問題を再現できるSamsungデバイス(S6)を購入した後、私は以下の解決策を思いつきました。

エラー自体は、Marshmallowで追加されたフローティングツールバーとアクションモードから発生します。次にユーザは、サムスンのデバイス上のアプリのクラッシュをフローティングツールバーを閉じずに別のアクティビティ(例えばバックキー)に移動した場合

floating toolbar

:マシュマロデバイス上のテキストを選択すると、このような何かがアップします。基本的には、今後の活動にフローティングツールバーを再び追加しようとしています。フローティングツールバー上の

より:https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-text-selection

だから、解決策は、動作モードのライフサイクルを管理し、すべての新しい活動が開始される前に、それが終了することを確認することです。私はすべてのアクティビティが継承する基本アクティビティクラスを用意していますので、そこでソリューションを追加するのが最も理にかなっています。

public class BaseActivity extends AppCompatActivity { 

    private ActionMode mActionMode; 

    /** 
    * Store action mode if it is started 
    * @param mode 
    */ 
    @Override 
    public void onActionModeStarted(ActionMode mode) { 
     super.onActionModeStarted(mode); 
     mActionMode = mode; 
    } 

    /** 
    * When activity is paused, make sure action mode is ended properly. 
    * This check would feel better to have in onDestroy(), but that seems to be 
    * too late down the life cycle and the crash keeps on occurring. The drawback 
    * of this solution is that the action mode is finished when app is minimized etc. 
    */ 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     endActionMode(); 
    } 

    /** 
    * Makes sure action mode is ended 
    */ 
    private void endActionMode() { 
     if (mActionMode != null) { 
      mActionMode.finish(); /** immediately calls {@link #onActionModeFinished(ActionMode)} */ 
     } 
    } 

    /** 
    * Clear action mode every time it finishes. 
    * @param mode 
    */ 
    @Override 
    public void onActionModeFinished(ActionMode mode) { 
     super.onActionModeFinished(mode); 
     mActionMode = null; 
    } 
} 
+0

ああ、私のアプリで起こることがあるかどうかチェックしてみる必要があります。 –

+1

私が取り組んでいるアプリケーションの主な見解はWebViewsに基づいています。これは、ユーザーが選択可能な多くのコンテンツを持っているため、バグを経験する傾向があるので、このバグを私にとってはるかに深刻にしました –

+0

このバグを削除しようとしました!Androidトラッカーの問題を解決してAndroidチームが解決するようにしてくださいhttps://code.google.com/p/android/issues/detail?id=208906 –

関連する問題