在尝试显示Facebook对话框时获取'BadTokenException:无法添加窗口' - Android

时间:2011-05-05 13:42:26

标签: android facebook

我在尝试从Facebook SDK显示墙上发布对话框时遇到错误令牌异常(我每运行2次该应用程序就会发生这种情况)。

我有一个'发布'按钮,其作用是在用户登录到他的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 android.os.BinderProxy@405db9f8 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天,但却找不到任何相关内容。

谢谢!

4 个答案:

答案 0 :(得分: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 :(得分:1)

当然还有代码如

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

在ActivityGroup派生类中运行 - 就像在选项卡式Activity的单个选项卡下切换许多活动一样。确保

中的'this'
AlertDialog.Builder builder = new AlertDialog.Builder(WhateverActivity.this);

取代了对WhateverActivity的父级的正确引用,如

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

答案 2 :(得分:0)

看起来您已经提供了一些不再处于活动状态的上下文/活动对象的方法。 可能在postOnWall方法中。 该方法中的this是当前显示的活动吗?

答案 3 :(得分:0)

面对同样的问题。据我所知,从谷歌搜索,它与你的活动有时在Facebook登录活动返回其结果时没有准备好。为什么?毫无头绪。

但我认为这样可以更好地工作:在类中定义一个标志,在AuthListener中设置标志,并在onStart if if set中设置警告。那么你肯定会在自己的活动中安心:

private boolean authSuccess = false;

...

public class SampleAuthListener implements AuthListener {
    authSuccess = true;

...

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

免责声明:我的Java / Android经验非常少。