SDK согласия Google - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь использовать Google ConsentSDK для отображения в форме согласия приложения Android.Когда я вызываю form.show (), я получаю эту ошибку: «Ошибка формы согласия Форма согласия не готова для отображения».Кто может мне помочь?

Мой код:

  ConsentForm form = new ConsentForm.Builder(context, privacyUrl)
            .withListener(new ConsentFormListener() {
                @Override
                public void onConsentFormLoaded() {
                    // Consent form loaded successfully.
                    Log.d("SplashScreen", "Consent form Loaded ");
                }

                @Override
                public void onConsentFormOpened() {
                    // Consent form was displayed.
                    Log.d("SplashScreen", "Consent form opened ");
                }

                @Override
                public void onConsentFormClosed(
                        ConsentStatus consentStatus, Boolean userPrefersAdFree) {
                    // Consent form was closed.
                    Log.d("SplashScreen", "Consent form Closed ");
                }

                @Override
                public void onConsentFormError(String errorDescription) {
                    // Consent form error.
                    Log.d("SplashScreen", "Consent form error " + errorDescription);
                }
            })
            .withPersonalizedAdsOption()
            .withNonPersonalizedAdsOption()
            .build();
    form.load();
    form.show();

Ответы [ 4 ]

0 голосов
/ 17 февраля 2019

Простой ответ заключается в том, что форму нельзя отобразить, пока она не загрузится. документы на этот нюанс довольно ужасны.Исправление заключается в том, чтобы позвонить form.show() в onConsentFormLoaded() следующим образом:

public class MyGdprHelper {
    private ConsentForm form;

    private void getUsersConsent() {
        form = new ConsentForm.Builder(context, privacyUrl)
                .withListener(new ConsentFormListener() {
                    @Override
                    public void onConsentFormLoaded() {
                        // Consent form loaded successfully.
                        form.show();
                    }

                    @Override public void onConsentFormOpened() {...}
                    @Override public void onConsentFormClosed(ConsentStatus consentStatus, Boolean userPrefersAdFree) {...}
                    @Override public void onConsentFormError(String errorDescription) {...}
                )
                .withPersonalizedAdsOption()
                .withNonPersonalizedAdsOption()
                .withAdFreeOption()
                .build();
        form.load();
    }
    ...
}
0 голосов
/ 01 июня 2018

Вот мой вспомогательный класс для Google Consent SDK, который я использую в своем приложении.Чтобы инициализировать информацию о согласии и при необходимости отобразить форму согласия, у меня есть следующий код в onCreate() методе моей основной деятельности:

GdprHelper gdprHelper = new GdprHelper(this);
gdprHelper.initialise();

Аналогичным образом я запускаю следующий код, когда пользователь нажимает «Сбросить конфиденциальность»согласия "в настройках:

GdprHelper gdprHelper = new GdprHelper(this);
gdprHelper.resetConsent();

, где оба раза это ссылка на текущую текущую деятельность.

Полная реализация вспомогательного класса:

    package com.example.app;

    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.widget.Toast;

    import com.google.ads.consent.ConsentForm;
    import com.google.ads.consent.ConsentFormListener;
    import com.google.ads.consent.ConsentInfoUpdateListener;
    import com.google.ads.consent.ConsentInformation;
    import com.google.ads.consent.ConsentStatus;

    import java.net.MalformedURLException;
    import java.net.URL;

    public class GdprHelper {

        private static final String PUBLISHER_ID = "YOUR-PUBLISHER-ID";
        private static final String PRIVACY_URL = "YOUR-PRIVACY-URL";
        private static final String MARKET_URL_PAID_VERSION = "market://details?id=com.example.app.pro";

        private final Context context;

        private ConsentForm consentForm;

        public GdprHelper(Context context) {
            this.context = context;
        }

        // Initialises the consent information and displays consent form if needed
        public void initialise() {
            ConsentInformation consentInformation = ConsentInformation.getInstance(context);
            consentInformation.requestConsentInfoUpdate(new String[]{PUBLISHER_ID}, new ConsentInfoUpdateListener() {
                @Override
                public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                    // User's consent status successfully updated.
                    if (consentStatus == ConsentStatus.UNKNOWN) {
                        displayConsentForm();
                    }
                }

                @Override
                public void onFailedToUpdateConsentInfo(String errorDescription) {
                    // Consent form error. Would be nice to have proper error logging. Happens also when user has no internet connection
                    if (BuildConfig.BUILD_TYPE.equals("debug")) {
                        Toast.makeText(context, errorDescription, Toast.LENGTH_LONG).show();
                    }
                }
            });
        }

        // Resets the consent. User will be again displayed the consent form on next call of initialise method
        public void resetConsent() {
            ConsentInformation consentInformation = ConsentInformation.getInstance(context);
            consentInformation.reset();
        }

        private void displayConsentForm() {

            consentForm = new ConsentForm.Builder(context, getPrivacyUrl())
                    .withListener(new ConsentFormListener() {
                        @Override
                        public void onConsentFormLoaded() {
                            // Consent form has loaded successfully, now show it
                            consentForm.show();
                        }

                        @Override
                        public void onConsentFormOpened() {
                            // Consent form was displayed.
                        }

                        @Override
                        public void onConsentFormClosed(
                                ConsentStatus consentStatus, Boolean userPrefersAdFree) {
                            // Consent form was closed. This callback method contains all the data about user's selection, that you can use.
                            if (userPrefersAdFree) {
                                redirectToPaidVersion();
                            }
                        }

                        @Override
                        public void onConsentFormError(String errorDescription) {
                            // Consent form error. Would be nice to have some proper logging
                            if (BuildConfig.BUILD_TYPE.equals("debug")) {
                                Toast.makeText(context, errorDescription, Toast.LENGTH_LONG).show();
                            }
                        }
                    })
                    .withPersonalizedAdsOption()
                    .withNonPersonalizedAdsOption()
                    .withAdFreeOption()
                    .build();
            consentForm.load();
        }

        private URL getPrivacyUrl() {
            URL privacyUrl = null;
            try {
                privacyUrl = new URL(PRIVACY_URL);
            } catch (MalformedURLException e) {
                // Since this is a constant URL, the exception should never(or always) occur
                e.printStackTrace();
            }
            return privacyUrl;
        }

        private void redirectToPaidVersion() {
            Intent i = new Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse(MARKET_URL_PAID_VERSION));
            context.startActivity(i);
        }
    }
0 голосов
/ 28 января 2019

На основе ответа @WebMajstr и комментария @ Фрэнка, вот мой собственный класс, который имеет две дополнительные функции: проверены прослушиватель обратного вызова и пользователи, не входящие в EEA.

пакет com.levionsoftware.photos.utils.consensus;

import android.content.Context;
import android.util.Log;

import com.google.ads.consent.ConsentForm;
import com.google.ads.consent.ConsentFormListener;
import com.google.ads.consent.ConsentInfoUpdateListener;
import com.google.ads.consent.ConsentInformation;
import com.google.ads.consent.ConsentStatus;
import com.google.ads.consent.DebugGeography;
import com.levionsoftware.photos.MyApplication;
import com.levionsoftware.photos.R;

import java.net.MalformedURLException;
import java.net.URL;

public class GdprHelper {
    private static final String PUBLISHER_ID = "pub-2308843076741286";

    private final Context context;
    private final ConsensusUpdatedListener consensusUpdatedListener;

    private ConsentForm consentForm;

    public GdprHelper(Context context, ConsensusUpdatedListener consensusUpdatedListener) {
        this.context = context;
        this.consensusUpdatedListener = consensusUpdatedListener;
    }

    // Initialises the consent information and displays consent form if needed
    public void initialise() {
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);

        consentInformation.setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA);

        consentInformation.requestConsentInfoUpdate(new String[]{PUBLISHER_ID}, new ConsentInfoUpdateListener() {
            @Override
            public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                Log.d("GdprHelper", "onConsentInfoUpdated: " + consentStatus.toString());

                if(consentInformation.isRequestLocationInEeaOrUnknown()) {
                    Log.d("GdprHelper", "isRequestLocationInEeaOrUnknown: true");
                    // If the isRequestLocationInEeaOrUnknown() method returns true:
                    //  If the returned ConsentStatus is PERSONALIZED or NON_PERSONALIZED, the user has already provided consent. You can now forward consent to the Google Mobile Ads SDK.
                    //  If the returned ConsentStatus is UNKNOWN, see the Collect consent section below, which describes the use of utility methods to collect consent.

                    // User's consent status successfully updated.
                    if (consentStatus == ConsentStatus.UNKNOWN) {
                        consensusUpdatedListener.reset();
                        displayConsentForm();
                    } else {
                        consensusUpdatedListener.set(consentStatus == ConsentStatus.NON_PERSONALIZED, false);
                    }
                } else {
                    Log.d("GdprHelper", "isRequestLocationInEeaOrUnknown: false");
                    // If the isRequestLocationInEeaOrUnknown() method returns false:
                    //  the user is not located in the European Economic Area and consent is not required under the EU User Consent Policy. You can make ad requests to the Google Mobile Ads SDK.
                    consensusUpdatedListener.set(false, true);
                }
            }

            @Override
            public void onFailedToUpdateConsentInfo(String errorDescription) {
                // Consent form error. Would be nice to have proper error logging. Happens also when user has no internet connection
                MyApplication.toastSomething(new Exception(errorDescription));
            }
            });
    }

    // Resets the consent. User will be again displayed the consent form on next call of initialise method
    public void resetConsent() {
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);
        consentInformation.reset();
    }

    private void displayConsentForm() {
        consentForm = new ConsentForm.Builder(context, getPrivacyUrl())
                .withListener(new ConsentFormListener() {
                    @Override
                    public void onConsentFormLoaded() {
                        // Consent form has loaded successfully, now show it
                        consentForm.show();
                    }

                    @Override
                    public void onConsentFormOpened() {
                        // Consent form was displayed.
                    }

                    @Override
                    public void onConsentFormClosed(
                            ConsentStatus consentStatus, Boolean userPrefersAdFree) {
                        // Consent form was closed. This callback method contains all the data about user's selection, that you can use.
                        Log.d("GdprHelper", "onConsentFormClosed: " + consentStatus.toString());
                        if (consentStatus == ConsentStatus.UNKNOWN) {
                            consensusUpdatedListener.reset();
                            displayConsentForm();
                        } else {
                            consensusUpdatedListener.set(consentStatus == ConsentStatus.NON_PERSONALIZED, false);
                        }
                    }

                    @Override
                    public void onConsentFormError(String errorDescription) {
                        // Consent form error. Would be nice to have some proper logging
                        MyApplication.toastSomething(new Exception(errorDescription));
                    }
                })
                .withPersonalizedAdsOption()
                .withNonPersonalizedAdsOption()
                //.withAdFreeOption()
                .build();
        consentForm.load();
    }

    private URL getPrivacyUrl() {
        URL privacyUrl = null;
        try {
            privacyUrl = new URL(MyApplication.get().getString(R.string.privacyPolicyURL));
        } catch (MalformedURLException e) {
            // Since this is a constant URL, the exception should never(or always) occur
            e.printStackTrace();
        }
        return privacyUrl;
    }
}

Прослушиватель:

package com.levionsoftware.photos.utils.consensus;

public interface ConsensusUpdatedListener {
    void set(Boolean npa, Boolean consensusNotNeeded);

    void reset();
}

Редактировать: См. Android: получение местоположения пользователя с помощью Admob's Consent SDK , isRequestLocationInEeaOrUnknown должна называться AFTER onConsentInfoUpdated.

0 голосов
/ 26 мая 2018

Хорошо, я решил так: создайте экземпляр вашей формы с помощью Builder, а затем вам нужно вызвать form.load ().

Дождаться загрузки формы и вызвать .show () inside:

@Override
public void onConsentFormLoaded() {
                // Consent form loaded successfully... now you can show it.
                Log.d("SplashScreen", "Consent form Loaded ");
                showConsentForm();
}

Для этого я создал приватную функцию:

private showConsentForm(){ form.show(); }

Чтобы увидеть, как работает форма, вы можете попробовать это приложение: https://play.google.com/store/apps/details?id=com.mapkcode.whereis

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