2011-05-05 39 views
7

我試圖從Facebook SDK顯示牆上發佈對話框時收到錯誤的令牌異常(每兩次發生一次我運行應用程序)。嘗試顯示Facebook對話框時出現'BadTokenException:無法添加窗口' - Android

我有一個'發佈'按鈕,它的工作是顯示對話框,如果用戶登錄到他的FB帳戶,或顯示登錄對話框(然後立即顯示'貼在牆上'對話框)如果該用戶未登錄到他的帳戶。

這裏是上發佈按鈕的點擊監聽器 -

mPostButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      if(mLoginButton.getVisibility() == 0) 
       postOnWall(); 
      else 
       mLoginButton.performClick(); 
     } 
    }); 

這裏的onAuthSucceed()監聽器 -

public void onAuthSucceed() { 
    postOnWall(); 
} 

這裏的PostOnWall功能(其中顯示了發佈對話框) -

public void postOnWall() 
{ 
    Bundle params = new Bundle(); 
    params.putString("name", FBname); 
    params.putString("link", FBlink); 
    params.putString("description", FBdescription); 
    params.putString("picture", FBpicture); 
    con = this; 
    mFacebook.dialog(con, "feed", params, new SampleDialogListener()); 
} 

以下是錯誤的日誌 -

05-05 16:25:09.601: WARN/WindowManager(109): Attempted to add application window with unknown token HistoryRecord{405416b0 android.alco/.do_drive}. Aborting. 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.ViewRoot.setView(ViewRoot.java:527) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.app.Dialog.show(Dialog.java:241) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.Facebook.dialog(Facebook.java:622) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.do_drive.postOnWall(do_drive.java:258) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.do_drive$SampleAuthListener.onAuthSucceed(do_drive.java:172) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.SessionEvents.onLoginSuccess(SessionEvents.java:78) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.LoginButton$LoginDialogListener.onComplete(LoginButton.java:100) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.Facebook$1.onComplete(Facebook.java:308) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:133) 

我看了所有,我找不到解決方案。

編輯 - 這隻發生在用戶沒有登錄的情況下。在這種情況下,他按下'發佈'按鈕,登錄,然後調用'postOnWall'函數,這會產生錯誤。我現在正在爲此工作2天,並且找不到任何相關信息。

謝謝!

+1

'BadTokenException'幾乎總是用'Context'傳遞給它做。你的'this'指針是什麼? – 2011-05-05 14:07:25

+0

這是活動的上下文,而不是應用程序的。如果我使用應用程序上下文,則會顯示不同的錯誤。情況並非如此。 – Tofira 2011-05-05 14:09:46

回答

0

看起來您已經提供了一些方法,其中上下文/活動對象不再處於活動狀態。 可能在postOnWall方法中。 該方法中的this是當前顯示的活動嗎?

+0

是的,這是活動的上下文,而不是應用程序的。我不妨在那裏寫下[活動名稱]。這個。我知道這可能是一個問題,但我不使用應用程序上下文,所以這裏不是這種情況。 – Tofira 2011-05-05 14:08:18

0

面對同樣的問題。據我所知,從谷歌搜索,它與你的活動有時沒有準備好,當Facebook登錄活動返回其結果。爲什麼?沒有線索。

但是我認爲這樣會更好:在你的類中定義一個標誌,在AuthListener中設置標誌,並在onStart中顯示警告if if標誌。然後,你將肯定會在自己的活動的舒適性:

private boolean authSuccess = false; 

...

public class SampleAuthListener implements AuthListener { 
    authSuccess = true; 

...

protected void onStart() { 
    super.onStart(); 
    if (authSuccess) { 
     alert.show(); 
    } 
} 

免責聲明:我很少的Java/Android的經驗。

8
@Override 
public void onPageStarted(WebView view, String url, Bitmap favicon) { 
    Log.d("Facebook-WebView", "Webview loading URL: " + url); 
    super.onPageStarted(view, url, favicon); 
    if(FbDialog.this.isShowing()) 
     mSpinner.show(); 
} 
1

當然並且存在如

View view = getLocalActivityManager().startActivity(id, intent).getDecorView(); 
setContentView(view); 

被運行代碼的ActivityGroup衍生類內的情況下 - 在一個選項卡式活性的單個標籤下許多活動之間的切換的情況下。可以肯定的是,「這」在

AlertDialog.Builder builder = new AlertDialog.Builder(WhateverActivity.this); 

被通過適當的參考WhateverActivity的父更換喜歡

AlertDialog.Builder builder = new AlertDialog.Builder(ActivityGroupDerivedParentOfWhateverActivity.this); 
+0

謝謝...它救了我:) – Noman 2012-11-06 12:11:44

相關問題