Edited at

AndroidのAdvertising IDを最小構成で取得する


やりたいこと


  • AdIDを取得する

  • Google Play Serviceの必要なパッケージのみインストールする

プロジェクト的にはAdIDを取得したあとに何かをする要件がありますが、この記事では取得するところまでとします。

Google Play Serviceの全パッケージを導入すると当然アプリの容量が増えてしまいます。

なるべく導入するものは必要最小限としましょう!


環境


  • Android Studio 3.3.2

  • Kotlin 1.3.30


必要なパッケージを調べてみる

必要なパッケージを日本語で調べると com.google.android.gms.adsと出てきますが

公式ドキュメントによると com.google.android.gms.ads.identifierです。


The advertising ID APIs are available in the com.google.android.gms.ads.identifier package in the Google Play Services library.


Advertising IDより引用

Release Notesから最新版を見てみると最新版は16.0.0のようです。(2019年4月19日現在)


入れてみる

build.gradleのdependenciesに追加すればパッケージの導入可能です。

サポートライブラリの別バージョンを入れようとしてGradle Syncでエラーとなるためexcludeします。

AdIDはUIスレッド以外で取得しなければいけないためcoroutineも入れます。


build.gradle

    implementation 'com.google.android.gms:play-services-ads-identifier:16.0.0', {

exclude group: 'com.android.support', module: 'support-v4'
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.0'

ビルド時に下記エラーも発生したため、build.gradleのandroid以下にも追記します。


  • エラー内容


    More than one file was found with OS independent path 'META-INF/atomicfu.kotlin_module'


  • 追記内容



build.gradle

    packagingOptions {

pickFirst("META-INF/atomicfu.kotlin_module")
}


AdIDを取得する

処理の流れ

1. メインスレッド以外で実行する

2. AdIDのオプトアウト状態をチェックする。

3. オプトアウトしていない場合にAdIDを取得する。

今回はログに出すだけにします。


AdIDの取得コード

GlobalScope.launch {

try {
val info = AdvertisingIdClient.getAdvertisingIdInfo(this@MainActivity)
if (!info.isLimitAdTrackingEnabled) {
Log.d(tag, "AdId: ${info.id}")
} else {
Log.d(tag, "isLimitAdTrackingEnabled: true")
}
} catch (e: GooglePlayServicesNotAvailableException) {
Log.d(tag, e.message)
} catch (e: GooglePlayServicesRepairableException) {
Log.d(tag, e.message)
}
}

今回のサンプルコードはGitHubに置いてありますので良ければ参考にしてください。


番外編

日本語で調べた際に出てきたcom.google.android.gms.adsで実装するとどうなるでしょうか。

(最初はこちらの方法で実装しようとし、危うく闇落ちしかけました。)

com.google.android.gms.adsの最新版は 17.2.0です。(2019年4月19日現在)

このパッケージを導入しアプリを実行すると、下記のエラーが出てアプリがクラッシュします。

    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 

******************************************************************************
* The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers *
* should follow the instructions here: https://goo.gl/fQ2neu to add a valid *
* App ID inside the AndroidManifest. Google Ad Manager publishers should *
* follow instructions here: https://goo.gl/h17b6x. *
******************************************************************************

どうやら 17.0.0からAdMob App IDの記載が必須になったようです。


重要: Google Mobile Ads SDK バージョン 17.0.0 では、この手順は必須です。この タグを追加しない場合は、クラッシュして次のメッセージが表示されます。"The Google Mobile Ads SDK was initialized incorrectly."

Mobile Ads SDK(Android) スタートガイドから引用



どうするか

そっかー必須ならしょうがないねー、AdMob App ID取得して記載しようねー

とはなりません。

AdIDを取得したいだけでAdMobを使っていないのに。AdMobを使っていないのに( ‘ᾥ’ )

Google Mobile Ads SDK バージョン 17.0.0未満に下げる?

それはないでしょう。


どうしたか

めんどくさがらずに公式ドキュメントを読みました。

バッチリ書いてあります!

普段あまり意識しなかったimport文に使っているパッケージバッチリ書いてあります


番外編のまとめ

公式ドキュメント読みましょう!