2012-12-19 7 views
0

일부 Android 기기의 경우 앱을 처음 시작할 때 알림을 수신할지 묻는 메시지가 표시 될 때까지 내 Cordova 기반 앱이 충돌합니다. 여기에 일반적인 스택 트레이스는 다음과 같습니다앱이 코르도바에서 경고 메시지가 발생합니다.

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected]<i>[eight hex digits]</i> is not valid; is your activity running? 
at android.view.ViewRoot.setView(ViewRoot.java:535) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.app.Dialog.show(Dialog.java:241) 
at android.app.AlertDialog$Builder.show(AlertDialog.java:802) 
at org.apache.cordova.Notification$2.run(Notification.java:245) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3806) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

자바 스크립트 코드 :

navigator.notification.confirm(
    'Do you wish to receive push notifications?', 
    function(btnIndex) { 
     if (btnIndex == 1) { 
      push.enablePush(); 
      localStorage.pushAsked = true; 
     } else { 
      push.disablePush(); 
      localStorage.pushAsked = true; 
     } 
    }, 
    'Push Notifications', 
    'Yes,No' 
); 

어떤 아이디어가? 어떤 기기 나 Android 버전이 영향을 받는지 모르지만 그 문제는보고 한 사람들에게 있습니다.

저는 Cordova 2.2.0을 사용하고 있습니다.

답변

3

활동이 완료되는 동안 경고 대화 상자를 표시하려고하기 때문입니다.

당신은 CordovaChromeClient를 서브 클래스 화해 onJsAlert에 activity.isFinishing()()

나는이 버그를 해결 Github에서의 프로젝트를 만든 확인할 수 있습니다 : 아래의 예를 볼 수 있습니다 https://github.com/kruyvanna/CordovaAlertBug_Android

합니다.

class CordovaOnJsAlertBug extends DroidGap{ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    super.loadUrl("file:///android_asset/www/index.html"); 
} 

@Override 
public void init() { 
    Log.e(TAG, "init()"); 
    CordovaWebView webView = new CordovaWebView(CordovaOnJsAlertBug.this); 
    CordovaWebViewClient webViewClient; 
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) 
    { 
     webViewClient = new CordovaWebViewClient(this, webView); 
    } 
    else 
    { 
     webViewClient = new IceCreamCordovaWebViewClient(this, webView); 
    } 
    this.init(webView, webViewClient, new MyCordovaChromeClient(this, webView)); 
} 

private class MyCordovaChromeClient extends CordovaChromeClient{ 
    private CordovaInterface cordova; 
    public MyCordovaChromeClient(CordovaInterface ctx, CordovaWebView app) { 
     super(ctx, app); 
     this.cordova = ctx; 
    } 


    @Override 
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
     if(cordova.getActivity().isFinishing()){ 
      Log.w(TAG, "Trying to alert while activity is finishing!! -> ignore"); 
      result.cancel(); 
      return true; 
     } 

     return super.onJsAlert(view, url, message, result); 
    } 
} 
} 
+0

감사합니다. 한 가지 질문 : 하위 클래스가 대화 상자가 나타나지 않도록 가정 할 때 나는 맞습니까? 그 경우 나는 푸시 알림에 대해 사용자에게 프롬프트를 표시해야하기 때문에이를 해결할 방법이 필요합니다. – ToddD

+0

예. 대화 상자를 취소합니다. 이 예외의 원인이되는 코드를 포함 할 수 있습니까? 그것은 당신의 활동이 왜 파괴되었는지 이해하는데 도움이 될 수 있습니다. – vanna

+0

독점적 인 코드이기 때문에 실제로 그럴 수 없습니다. 하지만 푸시 알림 프롬프트를 기본 Java로 옮기고 적어도이 충돌을 제거했습니다. – ToddD

관련 문제