我正在展示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崩溃报告:
为什么会发生这种情况以及如何预防呢?我不确定要在consentForm.show()
之前加上什么支票,并且无法重现该问题。如果我在显示表单之前放了这张支票,也许就足够了:
if(!MainActivity.this.isFinishing() && !MainActivity.this.isDestroyed())
?
答案 0 :(得分:1)
最简单的方法是在consentForm.show()
周围放置一个try-catch块并捕获BadTokenException。
这不是很干净,但是很可能是在“活动”完成时发生的(可能是在对话框加载时用户从“最近”关闭了应用程序)。
如果这是我的项目,我首先尝试添加if语句(尽管您不需要MainActivity.this.
部分;您可以仅调用isFinishing()
和isDestroyed()
直)。由于您引用的是活动上下文,因此应予以注意。
但是,如果仍然崩溃,则应首先考虑对其进行复制。尝试在displayConsentForm()
被调用之前到达,然后从“最近”关闭应用程序。按时机玩,您可能会重现崩溃。如果没有,则只需添加try-catch。未显示“活动”,因为它会引发该错误,因此用户实际上不在应用程序中。