Сбой формы согласия GDPR: WindowManager BadTokenException - PullRequest
0 голосов
/ 03 декабря 2018

Я показываю бланк согласия Google на ВВПР , и я отмечаю многие из этих отчетов:

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 голосов
/ 03 декабря 2018

Самый простой способ обойти это - просто поставить блок try-catch вокруг consentForm.show() и поймать исключение BadTokenException.

Это не совсем чисто, но, вероятно, это происходит, когда заканчивается действие (может быть, пользователь закрывает приложение из «Недавних» прямо во время загрузки диалога).

Если бы это был мой проект, я сначала попытался бы добавить это, если у вас есть заявление (хотя вам не нужен MainActivity.this.часть, вы можете просто позвонить isFinishing() и isDestroyed() напрямую).Поскольку вы ссылаетесь на Контекст действия, об этом следует позаботиться.

Однако, если он все еще падает, вам следует сначала изучить его воспроизведение.Попробуйте добраться до вызова displayConsentForm(), а затем закройте приложение из списка «Последние».Поиграйте со временем, и вы, вероятно, воспроизведете аварию.Если нет, то просто добавьте try-catch.Активность не отображается, поскольку она выдает эту ошибку, поэтому пользователь фактически не находится в приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...