[Flurry][Unity][Android] 「There is a problem with the Google Play Services library, which is required for Android Advertising ID support. The Google Play Services library should be integrated in any app shipping in the Play Store that uses analytics or advertising.」というエラーが出るとき調べること

ヨメレバCSS
オリジナルCSS

 Flurryを組み込んだAndroid版を実行すると、

E/FlurryAgent(xxxxx): GOOGLE PLAY SERVICES ERROR: com.google.android.gms.ads.identifier.AdvertisingIdClient
E/FlurryAgent(xxxxx): There is a problem with the Google Play Services library, which is required for Android Advertising ID support. The Google Play Services library should be integrated in any app shipping in the Play Store that uses analytics or advertising.

というメッセージが出ることがあります。

 これは端的にいうと「何らかの理由でFlurryで広告IDが取得できない」場合に発生します。

また、「There is a problem with the Google Play Services library, which is required for Android Advertising ID support. The Google Play Services library should be integrated in any app shipping in the Play Store that uses analytics or advertising.」というメッセージは共通して出てくるのですがパターンがあります。

Google Play Serviceのライブラリが組み込まれてない場合

 広告ID(Advertising ID)を取得するためには、Google Play service SDKが必要です。

Advertising ID  (Android Developers)

 このライブラリが足りていない場合は、

E/FlurryAgent(xxxxx): GOOGLE PLAY SERVICES EXCEPTION: com.google.android.gms.common.GooglePlayServicesUtil

というエラーが同時に発生しているはずです。

そもそもGooglePlayServiceのクラスが見つからなかった場合ですね。

 対応としては、GooglePlayServiceのライブラリを組み込んでやります。

「extras\google\google_play_services\libproject\google-play-services_lib\libs\google-play-services.jar」をPlugins/Androidにコピー。

「extras\google\google_play_services\libproject\google-play-services_lib\res」をPlugins/Android/resにコピーします。

そしてPlugins/Android/Manifest.xmlの、<application>以下に

<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

を追加。

 jarファイルはどこかのPlugins/Androidでも取り込んでくれるようになりましたが、resはAssets/Plugins/Android/resにあるものしか取り込んでくれないので、ここに配置する必要があります。

参考:UnityにAndroid外部ライブラリ(google-play-services_lib)の導入方法

 また、これはProguardなどの難読化ツールで、「com.google.android.gms.common.GooglePlayServicesUtil」のクラス名がリフレクションで呼べない場合にも発生します。

検索すると「proguardの設定を見直せ」みたいなのが出てくるのはそれが原因。

Google Play Serviceのresを取り込めてない場合

 jarだけ取り込んでいると、

E/FlurryAgent(xxxxx): GOOGLE PLAY SERVICES EXCEPTION: null

というエラーになります。ライブラリロード時に何らかの例外が出てるっぽいですね。

Androidで出ている例外を拾ってみると、

I/Unity(xxxxx): AndroidJavaException: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
I/Unity(xxxxx): java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

となっています。

 この@integer/google_play_services_versionというのがGoogle Play Serviceのresに含まれているもので、resもインポートさせる理由です。

 面倒だったらAndroidManifest.xmlにあるこのパラメータをハードコーティングしてしまっても動きますが、それで大丈夫かはわからん。

またres以下がない場合、

 E/GooglePlayServicesUtil(xxxxx): The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.

というエラーが発生しています。

 これは無視してもいいらしいので、上のgoogle_play_services_versionも気をつけていけばresをまるごと取り込まなくてもいいのかもしれません。

Google Mobile Ads SDK FAQ

Google Mobile Ads SDKを使ったらエラーログが... (imxs開発者ブログ)

AdvertisingIdClientが見つからない場合

 google-play-services.jarのバージョンが古い場合、「com.google.android.gms.ads.identifier.AdvertisingIdClient」が含まれていないことがあります。

これは今から設定する場合はまず関係ないと思いますけれど。

そのときは、

E/FlurryAgent(xxxxx): GOOGLE PLAY SERVICES ERROR: com.google.android.gms.ads.identifier.AdvertisingIdClient

というのが発生しています。

 対応としてはライブラリのバージョンを上げる。

その他、取得できない場合にエラーを具体的に確認するための方法

 具体的にFlurryが何をやっているかというと、Advertising ID関連のクラスやメソッドをリフレクションで呼んで、Exceptionが発生したら「There is a problem with the Google Play Services library~」を出しているよう。

 その際に、そもそもGooglePlayServicesUtilが見つからなければGOOGLE PLAY SERVICES EXCEPTION、それ以外はGOOGLE PLAY SERVICES ERRORというふうになって、ExceptionのgetMessage()を付与しているみたい。

「There is a problem with the Google Play Services library~」の発生するタイミングは4つ。

・ライブラリがロードできないとき (GooglePlayServicesUtilを何か使ってる?)
・AdvertisingIdClient.getAdvertisingIdInfoをリフレクションで呼んで例外が発生したとき
・AdvertisingIdClient.Info.getIdをリフレクションで呼んで例外が発生したとき
・AdvertisingIdClient.Info.isLimitAdTrackingEnabledをリフレクションで呼んで例外が発生したとき

 つまり、Flurry関係なく、Advertising IDが取得できれば問題ないわけです。

 Androidネイティブアプリなら、Flurryの初期化処理付近でこれらを取得してみれば、具体的な例外が発生して、上手くいかない原因が分かります。

 Unityの場合はどうするか。Flurry初期化付近で呼び出してみる、というのは同じです。

次のようなコードで、Androidのメソッドを呼んでみます。

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity"); 

AndroidJavaClass ad = new AndroidJavaClass("com.google.android.gms.ads.identifier.AdvertisingIdClient");
AndroidJavaObject info = ad.CallStatic<AndroidJavaObject>("getAdvertisingIdInfo", activity);
string id = info.Call<string>("getId");
Debug.Log ("google ad id: " + id);
bool isLimitAdTrackingEnabled = info.Call<bool> ("isLimitAdTrackingEnabled");
Debug.Log("google ad isLimitAdTrackingEnabled: "+isLimitAdTrackingEnabled);

これが通ればここに問題はなく、Advertising IDも取れてきます。

 そうでないなら具体的な例外が出るので、あとはFlurryではなくAndroidのAdvertising IDのほうで調べて解決していくことができます。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)