fc2ブログ

記事一覧

InterstitialAdLoadCallback を実装すると文字化けのエラーが発生する事象に対応する方法 | Xamarin.Forms


今回は Admob のバージョン更新でかなりドハマりしたお話の3つ目です。Xamarin.GooglePlayServices.Ads 関連のパッケージを更新すると、InterstitialAd 関連のクラスが大幅に変更になっており、インタースティシャル広告に関する実装を再構築する必要がありました。その為、InterstitialAdLoadCallback を継承したクラスを使用して広告が表示された際のアクションを実装したのですが、ビルド時に文字化けのエラーが発生するようになりました。前回のエラーに引き続き、このエラーの対応方法が全く分からず、途方に暮れていましたが、派生クラスで一度メソッドを書き換えたクラスを継承すると正しく動作するようになりました。



前提条件
・Windows10 Pro 64Bit 1903
・Visual Studio 2022 Community v17.3.6
・Xamarin 17.3.0.308 (NuGet Xamarin.Forms 4.6.0.1141)
Xamarin.GooglePlayServices.Ads v121.2.0



1.エラー内容

ビルド時に以下のエラーが発生します。エンコードの違いなのか、文字化けしたままのエラー内容になっています。その為、onAdLoaded が何か問題があるという事だけわかりますが、原因についてはさっぱりわかりません。

繧ィ繝ゥ繝シ: 蜷榊燕縺檎ォカ蜷医@縺ヲ縺・∪縺吶€・yInterstitialAdLoadCallback縺ョonAdLoaded(Object)縺ィAdLoadCallback縺ョonAdLoaded(InterstitialAd)縺ッ縺セ縺莉匁婿繧偵が繝シ繝舌・繝ゥ繧、繝峨@縺ヲ縺・∪縺帙s縺後€∝炎髯、蠕後・蜷榊燕縺悟酔縺倥〒縺・ public void onAdLoaded (java.lang.Object p0)


android12_12_admob_build.png



2.対応方法

InterstitialAdLoadCallback を継承したクラスで OnAdLoaded をオーバーロードさせたような形式のデリゲートイベントを実装します。そのクラスを継承して、成功時・失敗時の処理を実装します。

BaseInterstitialAdLoadCallback.cs
/// <summary>
/// InterstitialAdLoadCallbackを継承した派生クラス
/// OnAdLoaded(interstitialAd)イベントを実装する
/// </summary>
public abstract class BaseInterstitialAdLoadCallback : InterstitialAdLoadCallback
{
    [Register("onAdLoaded", "(Lcom/google/android/gms/ads/interstitial/InterstitialAd;)V", "GetOnAdLoadedHandler")]
    public virtual void OnAdLoaded(InterstitialAd interstitialAd)
    {
    }
    private static Delegate cb_onAdLoaded;
    private static Delegate GetOnAdLoadedHandler()
    {
        if (cb_onAdLoaded is null)
        {
            cb_onAdLoaded = JNINativeWrapper.CreateDelegate((Action<IntPtr, IntPtr, IntPtr>)n_onAdLoaded);
        }
        return cb_onAdLoaded;
    }
    private static void n_onAdLoaded(IntPtr jnienv, IntPtr native__this, IntPtr native_p0)
    {
        BaseInterstitialAdLoadCallback callback = GetObject<BaseInterstitialAdLoadCallback>(jnienv, native__this, JniHandleOwnership.DoNotTransfer);
        InterstitialAd interstitialAd = GetObject<InterstitialAd>(native_p0, JniHandleOwnership.DoNotTransfer);
        callback.OnAdLoaded(interstitialAd);
    }
}


MyInterstitialAdLoadCallback.cs
/// <summary>
/// BaseInterstitialAdLoadCallbackを継承した派生クラス
/// 広告が表示された場合、表示されなかった場合の処理を実装する
/// </summary>
public class MyInterstitialAdLoadCallback : BaseInterstitialAdLoadCallback
{
    Context _context = null;
    public MyInterstitialAdLoadCallback(Context context)
    {
        _context = context;
    }

    public override void OnAdLoaded(InterstitialAd interstitialAd)
    {
        base.OnAdLoaded(interstitialAd);

        //成功時の処理を実装します。
    }

    public override void OnAdFailedToLoad(LoadAdError p0)
    {
        base.OnAdFailedToLoad(p0);

        //失敗時の処理を実装します。
    }
}



【使用方法】
void ShowInterstitial()
{
    AdRequest.Builder requestBuilder = new AdRequest.Builder();
Context context = Xamarin.Forms.Forms.Context; //Android.App.Applicaiton.Contextだとエラーになります。 var callback = new MyInterstitialAdLoadCallback(context); InterstitialAd.Load(context, "Admobのキー", requestBuilder.Build(), callback); }


※ Context については Android.App.Applicaiton.Context だと実行時にエラーになりましたので、Obsolute の Xamarin.Forms.Forms.Context を使用を控えたい場合は、MainActivity などから取得したインスタンスに置き換えてください。


以上で、文字化けのエラーは発生しなくなり、正常にビルド終了し、インタースティシャル広告が表示できるようになりました。






最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
https://itblog.dynaspo.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。