Google同意SDK

时间:2018-05-26 08:46:59

标签: java android admob

我尝试使用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();

5 个答案:

答案 0 :(得分:6)

好的,我解决了这个问题:使用Builder创建表单实例,然后你必须调用form.load()。

等待表单加载并调用里面的.show():

@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

答案 1 :(得分:6)

以下是我在我的应用中使用的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);
        }
    }

答案 2 :(得分:0)

基于@WebMajstr答案和@Frank的评论,这是我自己的类,它具有两个附加功能:检查回调侦听器和非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: Getting user's location using Admob's Consent SDK,必须在onConsentInfoUpdated之后调用isRequestLocationInEeaOrUnknown。

答案 3 :(得分:0)

简单的答案是,只有在表单完成加载后才能显示该表单。这种细微差别的docs非常可怕。解决方法是像这样在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();
    }
    ...
}

答案 4 :(得分:0)

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.provider.Settings;
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.google.ads.mediation.admob.AdMobAdapter;
import com.google.android.gms.ads.AdRequest;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private ConsentForm consentForm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getConsentInformation();

        String android_id = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
        Log.d("Android", "Android ID : " + android_id);
    }

    private void getConsentInformation() {
        final ConsentInformation consentInformation = ConsentInformation.getInstance(MainActivity.this);
        String[] publisherIds = {"pub-0123456789012345"};

        consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
        @Override
        public void onConsentInfoUpdated(ConsentStatus consentStatus) {
            boolean inEEA = ConsentInformation.getInstance(MainActivity.this).isRequestLocationInEeaOrUnknown();
            if (inEEA) {
            switch (consentStatus) {
                case PERSONALIZED:
                personalizeAds(true);
                break;
                case NON_PERSONALIZED:
                personalizeAds(false);
                break;
                case UNKNOWN:
                displayConsentDialog();
                break;
                default:
                break;
        }
    }
}

        @Override
        public void onFailedToUpdateConsentInfo(String reason) {

        }
    });

    consentInformation.addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
    consentInformation.setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA);
    }

    private void personalizeAds(boolean isPersonalize) {

        AdRequest adRequest;
        if (isPersonalize) {
        adRequest = new AdRequest.Builder().build();
        } else {
        Bundle extras = new Bundle();
        extras.putString("npa", "1");
        adRequest = new AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter.class, extras).build();
        }
    }

    private void displayConsentDialog() {
        URL privacyUrl = null;
        try {
        // TODO: Replace with your app's privacy policy URL.
        privacyUrl = new URL("PRIVACY_POLICY");
        } catch (MalformedURLException e) {
        e.printStackTrace();
        // Handle error.
    }

    consentForm = new ConsentForm.Builder(this, privacyUrl).withListener(new ConsentFormListener() {
    @Override
    public void onConsentFormLoaded() {
        super.onConsentFormLoaded();
        consentForm.show();
    }

    @Override
    public void onConsentFormClosed(ConsentStatus consentStatus, Boolean userPrefersAdFree) {
        super.onConsentFormClosed(consentStatus, userPrefersAdFree);
        if (consentStatus.equals(ConsentStatus.PERSONALIZED))
            personalizeAds(true);
        else
            personalizeAds(false);
        }
    })
    .withNonPersonalizedAdsOption()
    .withNonPersonalizedAdsOption()
    .build();
    consentForm.load();

    }
}