GDPR同意表单崩溃:WindowManager BadTokenException

时间:2018-12-03 19:29:20

标签: android android-activity android-context android-windowmanager

我正在展示Google's GDPR consent form,并且注意到很多此类报告:

Fatal Exception: android.view.WindowManager$BadTokenException
Unable to add window -- token android.os.BinderProxy@38734f2 is not valid; is your activity running?
com.my.project.MainActivity$4.onConsentFormLoaded

在上下文中,我使用MainActivity.this

private void displayConsentForm() {
    consentForm = new ConsentForm.Builder(MainActivity.this, GeneralUtils.getAppsPrivacyPolicy())
            .withListener(new ConsentFormListener() {
                @Override
                public void onConsentFormLoaded() {
                    consentForm.show(); // crashing here for some users
                }

                @Override
                public void onConsentFormOpened() { }

                @Override
                public void onConsentFormClosed(
                    ConsentStatus consentStatus, Boolean userPrefersAdFree) {

                    if(userPrefersAdFree) {
                            ConsentInformation.getInstance(MainActivity.this)
                                    .setConsentStatus(NON_PERSONALIZED);
                    } else {
                        ConsentInformation.getInstance(MainActivity.this)
                                .setConsentStatus(consentStatus);
                    }

                    initAds();
                }

                @Override
                public void onConsentFormError(String errorDescription) {
                    Log.e("Error",errorDescription);
                }
            })
            .withPersonalizedAdsOption()
            .withNonPersonalizedAdsOption()
            .withAdFreeOption()
            .build();

    consentForm.load();
}

以下是其他Firebase崩溃报告:

enter image description here

为什么会发生这种情况以及如何预防呢?我不确定要在consentForm.show()之前加上什么支票,并且无法重现该问题。如果我在显示表单之前放了这张支票,也许就足够了:

if(!MainActivity.this.isFinishing() && !MainActivity.this.isDestroyed())

1 个答案:

答案 0 :(得分:1)

最简单的方法是在consentForm.show()周围放置一个try-catch块并捕获BadTokenException。

这不是很干净,但是很可能是在“活动”完成时发生的(可能是在对话框加载时用户从“最近”关闭了应用程序)。

如果这是我的项目,我首先尝试添加if语句(尽管您不需要MainActivity.this.部分;您可以仅调用isFinishing()isDestroyed()直)。由于您引用的是活动上下文,因此应予以注意。

但是,如果仍然崩溃,则应首先考虑对其进行复制。尝试在displayConsentForm()被调用之前到达,然后从“最近”关闭应用程序。按时机玩,您可能会重现崩溃。如果没有,则只需添加try-catch。未显示“活动”,因为它会引发该错误,因此用户实际上不在应用程序中。