【问题标题】:Guide for Xamarin.Google.UserMessagingPlatform?Xamarin.Google.UserMessagingPlatform 指南?
【发布时间】:2021-09-18 23:05:52
【问题描述】:

我正处于使用 Xamarin / C# 设置我的 Android 应用程序的最后阶段。我已经实施了 Google Admob,但 GDPR 规则规定我必须有隐私声明才能显示广告。谷歌的文档说同意 SDK 已被弃用,我应该使用新的用户消息传递平台https://developers.google.com/admob/ump/android/quick-start

我已经下载了 Nuget 包 Xamarin.Google.UserMessagingPlatform (https://www.nuget.org/packages/Xamarin.Google.UserMessagingPlatform/1.0.0?_src=template) 并导入了库,但我正在努力将 Google 的代码翻译到我的项目中,并且在网上搜索后似乎没有任何地方的实时文档链接带有 C#/Xamarin 中的实现示例。包 URL 404s 上的项目站点和源存储库指向通用 Xamarin 存储库,但我在其中找不到对 UMP 的引用。

具体来说,我不知道如何处理的一种说法是:

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.
            }

有没有用 C# 实现的例子?

【问题讨论】:

  • 我已经搜索了项目站点并得到了404。我会反馈这个问题。
  • 你找到任何Android完整实现了吗?因为我也找不到任何东西。谷歌的代码在我看来相当薄弱,几乎没有,而且我敢肯定有缺失的部分。
  • 不幸的是还没有
  • 已报告此问题。稍后会修复。

标签: c# android xamarin xamarin.android user-messaging-platform


【解决方案1】:

在 MainActivity.OnCreate 中,在调用 base.OnCreate(bundle) 之后的一段时间;插入此代码 sn-p:

        App.LogMessage("DEBUG: MainActivity.OnCreate: Starting consent management flow, via UserMessagingPlatform.");
        try
        {
            ConsentRequestParameters requestParameters = new ConsentRequestParameters
                .Builder()
                .SetTagForUnderAgeOfConsent(false)
                .Build();

            IConsentInformation consentInformation = UserMessagingPlatform.GetConsentInformation(this);

            consentInformation.RequestConsentInfoUpdate(
                this,
                requestParameters,
                new GoogleUMPConsentUpdateSuccessListener(
                    () =>
                    {
                        // The consent information state was updated.
                        // You are now ready to check if a form is available.
                        if (consentInformation.IsConsentFormAvailable)
                        {
                            UserMessagingPlatform.LoadConsentForm(
                                this,
                                new GoogleUMPFormLoadSuccessListener((IConsentForm f)=> {
                                    this.googleUMPConsentForm = f;
                                    this.googleUMPConsentInformation = consentInformation;
                                    App.LogMessage("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((FormError e)=> {
                                    // Handle the error.
                                    App.LogMessage("ERROR: MainActivity.OnCreate: Consent management flow: failed in LoadConsentForm with error " + e.Message);
                                }));
                        }
                        else
                        {
                            App.LogMessage("DEBUG: MainActivity.OnCreate: Consent management flow: RequestConsentInfoUpdate succeeded but no consent form was available.");
                        }
                    }),
                new GoogleUMPConsentUpdateFailureListener(
                    (FormError e) =>
                    {
                        // Handle the error.
                        App.LogMessage("ERROR: MainActivity.OnCreate: Consent management flow: failed in RequestConsentInfoUpdate with error " + e.Message);
                    })
                );
        }
        catch (Exception ex)
        {
            App.LogMessage("ERROR: MainActivity.OnCreate: Exception thrown during consent management flow: ", ex);
        }

然后,在 MainActivity 类的主体中,您还需要添加以下定义:

    private IConsentForm googleUMPConsentForm = null;
    private 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)
                {
                    App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is being displayed.");
                    DisplayAdvertisingConsentForm();
                }
                else
                {
                    App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Consent form is not being displayed because consent status is "+ googleUMPConsentInformation.ConsentStatus.ToString());
                }
            }
            else
            {
                App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: consent form or consent information missing.");
            }
        }
        catch(Exception ex)
        {
            App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentFormIfNecessary: Exception thrown: ", ex);
        }
    }

    public void DisplayAdvertisingConsentForm()
    {
        try
        {
            if (googleUMPConsentForm != null && googleUMPConsentInformation != null)
            {
                App.LogMessage("DEBUG: MainActivity.DisplayAdvertisingConsentForm: Consent form is being displayed.");

                googleUMPConsentForm.Show(this, new GoogleUMPConsentFormDismissedListener(
                        (FormError f) =>
                        {
                            if (googleUMPConsentInformation.ConsentStatus == 2) // required
                            {
                                App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: Consent was dismissed; showing it again because consent is still required.");
                                 DisplayAdvertisingConsentForm();
                            }
                        }));
            }
            else
            {
                App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: consent form or consent information missing.");
            }
        }
        catch (Exception ex)
        {
            App.LogMessage("ERROR: MainActivity.DisplayAdvertisingConsentForm: Exception thrown: ", ex);
        }
    }

    public class GoogleUMPConsentFormDismissedListener : Java.Lang.Object, IConsentFormOnConsentFormDismissedListener
    {
        public GoogleUMPConsentFormDismissedListener(Action<FormError> failureAction)
        {
            this.a = failureAction;
        }
        public void OnConsentFormDismissed(FormError f)
        {
            a(f);
        }

        private Action<FormError> a = null;
    }


    public class GoogleUMPConsentUpdateFailureListener : Java.Lang.Object, IConsentInformationOnConsentInfoUpdateFailureListener
    {
        public GoogleUMPConsentUpdateFailureListener(Action<FormError> failureAction)
        {
            this.a = failureAction;
        }
        public void OnConsentInfoUpdateFailure(FormError f)
        {
            a(f);
        }

        private Action<FormError> a = null;
    }

    public class GoogleUMPConsentUpdateSuccessListener : Java.Lang.Object, IConsentInformationOnConsentInfoUpdateSuccessListener
    {
        public GoogleUMPConsentUpdateSuccessListener(Action successAction)
        {
            this.a = successAction;
        }

        public void OnConsentInfoUpdateSuccess()
        {
            a();
        }

        private Action a = null;
    }

    public class GoogleUMPFormLoadFailureListener : Java.Lang.Object, UserMessagingPlatform.IOnConsentFormLoadFailureListener
    {
        public GoogleUMPFormLoadFailureListener(Action<FormError> failureAction)
        {
            this.a = failureAction;
        }
        public void OnConsentFormLoadFailure(FormError e)
        {
            a(e);
        }

        private Action<FormError> a = null;
    }

    public class GoogleUMPFormLoadSuccessListener : Java.Lang.Object, UserMessagingPlatform.IOnConsentFormLoadSuccessListener
    {
        public GoogleUMPFormLoadSuccessListener(Action<IConsentForm> successAction)
        {
            this.a = successAction;
        }
        public void OnConsentFormLoadSuccess(IConsentForm f)
        {
            a(f);
        }

        private Action<IConsentForm> a = null;
    }

【讨论】:

    【解决方案2】:

    我在我的博客中写了完整的tutorial,但在这里你有它:

    AdMob 部分

    1. 转到您的AdMob account

    2. 转到隐私和消息并选择电话图标

    1. 创建新消息并填写所需信息。

    1. 配置您的消息:

    1. 为您的应用添加隐私权政策

    1. 保存并发布。

    C# 部分

    1. 从 NuGet 下载 Xamarin.Google.UserMessagingPlatform

    2. 仔细检查您的 AndroidManifest.xml 是否包含以下两行:

    <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" />
    

    您可以从您的 AdMob 帐户中获取 AD_UNIT_IDAPP_ID

    1. 在此行之后加载/复制 GDPR 代码(之前不要这样做!):
    MobileAds.Initialize(this);
    
    1. 复制并粘贴此代码:
    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;
    }
    
    1. 加载 GDPR:
    MobileAds.Initialize(this);
    SetGDPR();
    

    仅此而已!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多