
Google Play Service SDKでAndroid端末の広告IDを取得する
少し前の話になりますが、2014年8月1日よりGoogleの規約が変更され、アプリ内でAndroid端末のIMEIやAndroidIDを取得することがNGになりました。この規約変更以降、代わりに広告IDを利用する必要が発生しました。 このタイミング以前にGoogle Playに登録されたアプリは大丈夫なのですが、いずれにせよ新規登録やアップデートする際にチェックされるので、2017年の現在では避けては通れない対応と言えます。
Androidの広告IDを取得する方法などについてはあまり日本語の記事がなく、そもそもAdvertising-IDで検索するとほとんどがiOS関連の記事ばかりでした。 そこで今回は、Android端末から広告ID(Advertising-ID)を取得するときの設定方法や注意点などについて私の経験から記載しようと思います。 同じような悩みを持たれている人にとって、解決の糸口になれれば幸いです。
Android端末で広告IDを確認する方法
iOSでは端末自体でAdvertising Identifier(IDFA)は直接参照することができません。が、Android端末では広告IDを確認することが可能です。(※広告IDはAndroid2.2.3以上対応) IMEIは「設定」→「端末情報」→「端末の状態」から確認することができますが、ここでは広告IDを確認することができません。

どこから確認するかというとアプリからです。 アプリ一覧に「Google設定」というアプリがあるはずです。(ない場合はGooglePlayから「Google Play開発者サービス」をインストールまたは更新すればOKです。)

このアプリを起動して「広告」を選択すると、広告IDの確認ができます。
操作方法は基本iOSと同様です。広告IDのリセットをすることでIDを再発行することが可能ですし、「インタレストベース広告をオプトアウト」にチェックを入れることで、『端末の広告IDをアプリなどで利用しないことを宣言』することができます。 実際にアプリ側では広告IDを取得できるのですが、このチェックを無視して広告IDを利用していた場合、アプリがマーケットからリジェクトされることでしょう。アプリ開発側は注意が必要ですね!
Google Play Servece SDKのセットアップ
「Google Play Servece SDK」の追加
Android SDK ManagerからSDKを取得します。


Eclipse上のこのアイコンをクリックしてAndroid SDK Managerを起動します。 「Google Play services」にチェックを入れてインストール。ここでは後ほど利用する「Android Support Libraty」も合わせてインストールします。


取得した「Google Play services」は以下のパスにあるので、eclipseにプロジェクトとしてインポートします。
{SDKロケーション}\extras\google\google_play_services


インポートしたライブラリプロジェクト。


実際に開発したいプロジェクトにこの「Google Play services」を追加します。 対象プロジェクトを右クリックし、「プロパティ」→「Android」を選択します。 「追加」ボタンから「google_play_services_lib」を追加します。


次にアプリのAndroidManifest.xmlを設定する必要があります。
meta-dataタグの追加
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
ネットワーク権限の設定
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
詳しくはGoogle Developersを参照してください。
Google Developersサポートライブラリ「android-support-v4.jar」の追加
先ほど「google_play_services_lib」と一緒にインストールした「Android Support Library」を設定します。 対象プロジェクトを右クリックし、「プロパティ」→「javaのビルドパス」→「ライブラリ」→「外部jar」の追加を選択します。
{SDKロケーション}\extras\android\support\v4から「android-support-v4.jar」を設定します。


次に対象プロジェクトの「libs」フォルダにも「android-support-v4.jar」を直接コピーします。 以上でセットアップは完了となります。
広告ID取得プログラム(サンプル)
基本、広告IDの取得に関してはGoogle Developersに掲載されているものを利用すれば問題ありません。
Google APIs for Android(Sampleプログラム)※リファレンスサイトのSample原文を一部修正。
final String id = adInfo.getId();
final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
をtryの中に入れないとエラーハンドリング処理のあとに落ちてしまいましたので、下記のように変更しました。
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
...
// Do not call this function from the main thread. Otherwise,
// an IllegalStateException will be thrown.
public void getIdThread() {
Info adInfo = null;
try {
adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
final String id = adInfo.getId();
final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
} catch (IOException e) {
// Unrecoverable error connecting to Google Play services (e.g.,
// the old version of the service doesn't support getting AdvertisingId).
} catch (GooglePlayServicesAvailabilityException e) {
// Encountered a recoverable error connecting to Google Play services.
} catch (GooglePlayServicesNotAvailableException e) {
// Google Play services is not available entirely.
}
}
注意点
広告IDの取得はメインスレッドで実行できません


Google Developersの注意書きにあるとおり、広告IDの取得は別スレッドで行う必要があります。 メインスレッドで実施した場合、エラーになると記載されています。
別スレッドで処理を行うことにより、実際の開発では広告IDの取得がちゃんと行われたかをきちんと確認する、つまりwait処理が必要になってきます。
eclipseでのjava開発であれば、wait処理を入れなくても広告IDの取得を漏らすことはほぼありませんでした。が、unityやcocos2d-xで開発を行った場合、wait処理で広告IDの取得を待つ必要がありました。 (wait処理を入れなかったため、値が全く取れませんでした!) 別スレッドで処理する以上、値が取れたことを待って確認する処理は必然です。 が、javaのみの開発でwait処理を入れずに広告IDの値が取れてしまったことで、かなりの時間、対応にハマってしまいました。
「インタレストベース広告をオプトアウト」判別処理を必ず実装すること
「インタレストベース広告をオプトアウト」がチェックされている端末でも広告IDは取得できてしまいます。 このチェックが入っていた場合、広告IDを取得できたとしても、利用しないように注意しましょう!
iOSの場合、アプリ申請時にリジェクトされますが、Androidの場合はアプリ公開後にGoogleからリジェクトされてしまいます。 「いつの間にかアプリがリジェクトされていた」とならないように、「インタレストベース広告をオプトアウト」判別処理は必ず実装しましょう!