I am in the final stages of setting up my Android App using Xamarin / C#. I have implemented Google Admob but GDPR rules say that I must have a privacy notice to display ads. Google's documentation says that the Consent SDK is deprecated and that I should use the new User Messaging Platform https://developers.google.com/admob/ump/android/quick-start
I have downloaded the Nuget package Xamarin.Google.UserMessagingPlatform (https://www.nuget.org/packages/Xamarin.Google.UserMessagingPlatform/1.0.0?_src=template) and have imported the libraries but I am struggling to translate Google's code to my project and having searched online there does not appear to be a live documentation link anywhere with examples of implementation in C# / Xamarin. The project site on the package URL 404s and the source repository leads to the general Xamarin repository but I couldn't find a reference to UMP in there.
Specifically, one statement I do not know how to handle is this:
new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
@Override
public void onConsentInfoUpdateSuccess() {
// The consent information state was updated.
// You are now ready to check if a form is available.
}
},
new ConsentInformation.OnConsentInfoUpdateFailureListener() {
@Override
public void onConsentInfoUpdateFailure(FormError formError) {
// Handle the error.
}
Are there any examples of the implementation in C#?
Note: If you need iOS/MAUI support, raise your concerns in GitHub and/or Tweet to David Ortinau.
I wrote this full tutorial in my blog (for Android only), but here you have it:
Go to your AdMob account.
Go to Privacy & Messaging and choose the phone icon.
Download the Xamarin.Google.UserMessagingPlatform from NuGet.
Double-check that your AndroidManifest.xml has these two lines:
<activity android:name="com.google.android.gms.ads.AdActivity" android:value="AD_UNIT_ID" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="APP_ID" />
You can get AD_UNIT_ID and APP_ID from your AdMob account:
MobileAds.Initialize(this);
private void SetGDPR()
{
Console.WriteLine("DEBUG: MainActivity.OnCreate: Starting consent management flow, via UserMessagingPlatform.");
try
{
#if DEBUG
var debugSettings = new Xamarin.Google.UserMesssagingPlatform.ConsentDebugSettings.Builder(this)
.SetDebugGeography(Xamarin.Google.UserMesssagingPlatform.ConsentDebugSettings
.DebugGeography
.DebugGeographyEea)
.AddTestDeviceHashedId(Android.Provider.Settings.Secure.GetString(this.ContentResolver,
Android.Provider.Settings.Secure.AndroidId))
.Build();
#endif
var requestParameters = new Xamarin.Google.UserMesssagingPlatform.ConsentRequestParameters
.Builder()
.SetTagForUnderAgeOfConsent(false)
#if DEBUG
.SetConsentDebugSettings(debugSettings)
#endif
.Build();
var consentInformation = Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.GetConsentInformation(Context);
consentInformation.RequestConsentInfoUpdate(
Activity,
requestParameters,
new GoogleUMPConsentUpdateSuccessListener(
() =>
{
// The consent information state was updated.
// You are now ready to check if a form is available.
if (consentInformation.IsConsentFormAvailable)
{
Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.LoadConsentForm(
Context,
new GoogleUMPFormLoadSuccessListener((Xamarin.Google.UserMesssagingPlatform.IConsentForm f) => {
googleUMPConsentForm = f;
googleUMPConsentInformation = consentInformation;
Console.WriteLine("DEBUG: MainActivity.OnCreate: Consent management flow: LoadConsentForm has loaded a form, which will be shown if necessary, once the ViewModel is ready.");
DisplayAdvertisingConsentFormIfNecessary();
}),
new GoogleUMPFormLoadFailureListener((Xamarin.Google.UserMesssagingPlatform.FormError e) => {
// Handle the error.
Console.WriteLine("ERROR: MainActivity.OnCreate: Consent management flow: failed in LoadConsentForm with error " + e.Message);
}));
}
else
{
Console.WriteLine("DEBUG: MainActivity.OnCreate: Consent management flow: RequestConsentInfoUpdate succeeded but no consent form was available.");
}
}),
new GoogleUMPConsentUpdateFailureListener(
(Xamarin.Google.UserMesssagingPlatform.FormError e) =>
{
// Handle the error.
Console.WriteLine("ERROR: MainActivity.OnCreate: Consent management flow: failed in RequestConsentInfoUpdate with error " + e.Message);
})
);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.OnCreate: Exception thrown during consent management flow: ", ex);
}
}
private Xamarin.Google.UserMesssagingPlatform.IConsentForm googleUMPConsentForm = null;
private Xamarin.Google.UserMesssagingPlatform.IConsentInformation googleUMPConsentInformation = null;
public void DisplayAdvertisingConsentFormIfNecessary()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
/* ConsentStatus:
Unknown = 0,
NotRequired = 1,
Required = 2,
Obtained = 3
*/
if (googleUMPConsentInformation.ConsentStatus == 2)
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is being displayed.");
DisplayAdvertisingConsentForm();
}
else
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is not being displayed because consent status is " + googleUMPConsentInformation.ConsentStatus.ToString());
}
}
else
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: consent form or consent information missing.");
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Exception thrown: ", ex);
}
}
public void DisplayAdvertisingConsentForm()
{
try
{
if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
{
Console.WriteLine("DEBUG: MainActivity.DisplayAdvertisingConsentForm: Consent form is being displayed.");
googleUMPConsentForm.Show(Activity, new GoogleUMPConsentFormDismissedListener(
(Xamarin.Google.UserMesssagingPlatform.FormError f) =>
{
if (googleUMPConsentInformation.ConsentStatus == 2) // required
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: Consent was dismissed; showing it again because consent is still required.");
DisplayAdvertisingConsentForm();
}
}));
}
else
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: consent form or consent information missing.");
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR: MainActivity.DisplayAdvertisingConsentForm: Exception thrown: ", ex);
}
}
public class GoogleUMPConsentFormDismissedListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentFormOnConsentFormDismissedListener
{
public GoogleUMPConsentFormDismissedListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentFormDismissed(Xamarin.Google.UserMesssagingPlatform.FormError f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPConsentUpdateFailureListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentInformationOnConsentInfoUpdateFailureListener
{
public GoogleUMPConsentUpdateFailureListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentInfoUpdateFailure(Xamarin.Google.UserMesssagingPlatform.FormError f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPConsentUpdateSuccessListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.IConsentInformationOnConsentInfoUpdateSuccessListener
{
public GoogleUMPConsentUpdateSuccessListener(Action successAction)
{
a = successAction;
}
public void OnConsentInfoUpdateSuccess()
{
a();
}
private Action a = null;
}
public class GoogleUMPFormLoadFailureListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.IOnConsentFormLoadFailureListener
{
public GoogleUMPFormLoadFailureListener(Action<Xamarin.Google.UserMesssagingPlatform.FormError> failureAction)
{
a = failureAction;
}
public void OnConsentFormLoadFailure(Xamarin.Google.UserMesssagingPlatform.FormError e)
{
a(e);
}
private Action<Xamarin.Google.UserMesssagingPlatform.FormError> a = null;
}
public class GoogleUMPFormLoadSuccessListener : Java.Lang.Object, Xamarin.Google.UserMesssagingPlatform.UserMessagingPlatform.IOnConsentFormLoadSuccessListener
{
public GoogleUMPFormLoadSuccessListener(Action<Xamarin.Google.UserMesssagingPlatform.IConsentForm> successAction)
{
a = successAction;
}
public void OnConsentFormLoadSuccess(Xamarin.Google.UserMesssagingPlatform.IConsentForm f)
{
a(f);
}
private Action<Xamarin.Google.UserMesssagingPlatform.IConsentForm> a = null;
}
MobileAds.Initialize(this);
SetGDPR();
And that's all!