やりたいこと
- 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も入れます。
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'
-
追記内容
packagingOptions {
pickFirst("META-INF/atomicfu.kotlin_module")
}
AdIDを取得する
処理の流れ
- メインスレッド以外で実行する
- AdIDのオプトアウト状態をチェックする。
- オプトアウトしていない場合に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文に使っているパッケージバッチリ書いてあります
番外編のまとめ
公式ドキュメント読みましょう!