在尝试显示Facebook对话框时出现“BadTokenException:无法添加窗口”的错误 - Android。

7

当我尝试从Facebook SDK显示发布到墙上的对话框时,会出现“Bad Token Exception”(每运行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天时间研究它,但仍然找不到任何有关它的信息。

谢谢!


1
BadTokenException几乎总是与您传递的Context有关。您的this指针是什么? - Brian Dupuis
这是活动上下文,而不是应用程序的上下文。如果我使用应用程序上下文,会出现不同的错误。但事实并非如此。 - Tofira
4个回答

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派生类中 - 就像在选项卡活动的单个选项卡下切换多个活动的情况下一样。请确保'this'在

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

被一个适当的引用替换为WhateverActivity的父级,例如:

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

0

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


是的,它是活动上下文,而不是应用程序的上下文。我也可以在那里写[activity-name].this。我知道这可能是一个问题,但我不使用应用程序上下文,所以这里不是这种情况。 - Tofira

0

遇到了同样的问题。据我所知,从谷歌搜索来看,这与您的活动有时没有准备好,当Facebook登录活动返回其结果时有关。为什么?毫无头绪。

但是我认为这将更有效:在您的类中定义一个标志,在AuthListener中设置该标志,并在onStart中显示警报(如果设置了标志)。然后,您肯定会处于自己的活动舒适区内:

private boolean authSuccess = false;

...

public class SampleAuthListener implements AuthListener {
    authSuccess = true;

...

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

声明:我对Java/Android的经验非常有限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接