本文记录一下如何获取GAID,以及解答本周一个小伙伴问我的谷歌支付的问题。
获取GAID
GAID全称是Google Advertising ID,顾名思义就是谷歌广告ID,GAID是可以重置的唯一标识符,常用于针对用户推送个性化广告。
官方提供了两种库来获取GAID,下面分别介绍一下。
通过GooglePlay支持库获取
play-services-ads-identifier
基于Google Play Services实现了GAID的获取,所以当Google Play Services不可用时,无法获取GAID。
添加依赖库
在项目app module的build.gradle中的dependencies中添加依赖:
dependencies {
implementation("com.google.android.gms:play-services-ads-identifier:18.0.1")
}
获取GAID
获取方法很简单,实现代码如下:
class GaIdActivity : BaseGestureDetectorActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Thread {
try {
val advertisingIdInfo = AdvertisingIdClient.getAdvertisingIdInfo(this)
if (!advertisingIdInfo.isLimitAdTrackingEnabled) {
// 从2022年初开始,当isLimitAdTrackingEnabled()为true时
// 该API的返回值将为00000000-0000-0000-00000000
val gaId = advertisingIdInfo.id
}
} catch (e: IOException) {
e.printStackTrace()
} catch (e: GooglePlayServicesNotAvailableException) {
e.printStackTrace()
} catch (e: GooglePlayServicesRepairableException) {
e.printStackTrace()
}
}.start()
}
}
通过Jetpack支持库获取
最近在看官方文档时看到了另一种获取方式,不过对于要上架Google Play的App,仍然应该使用Google的支持库。
Jetpack提供的广告Id库,定义了一个与系统级广告供应商互动的接口。这个接口允许你的应用程序接收唯一的广告ID值。若手机中没有系统级广告供应商,则无法获取到GAID。
添加依赖库
在项目app module的build.gradle中的dependencies中添加依赖:
dependencies {
implementation 'androidx.ads:ads-identifier:1.0.0-alpha04'
implementation 'com.google.guava:guava:28.0-android'
}
获取GAID
代码如下:
class GaIdActivity : BaseGestureDetectorActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 必须先判断是否有广告id提供者
if (AdvertisingIdClient.isAdvertisingIdProviderAvailable(this)) {
try {
val advertisingIdInfo = AdvertisingIdClient.getAdvertisingIdInfo(this)
Futures.addCallback(advertisingIdInfo, object : FutureCallback<AdvertisingIdInfo> {
override fun onSuccess(result: AdvertisingIdInfo?) {
//获取成功
result?.run {
if (!isLimitAdTrackingEnabled) {
val gaId = result.id
}
}
}
override fun onFailure(t: Throwable) {
// 获取失败
}
}, Executors.newSingleThreadExecutor())
} catch (e: IOException) {
e.printStackTrace()
} catch (e: AdvertisingIdNotAvailableException) {
e.printStackTrace()
} catch (e: TimeoutException) {
e.printStackTrace()
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
}
在我的测试设备上试了一下,AdvertisingIdClient.isAdvertisingIdProviderAvailable
返回了false,也就是没有广告供应商。
官方文档中有提到如何注册广告ID提供者,但是需要自定义ContentProvider
,后续有时间我会研究看看。
谷歌支付订阅优惠内容
本周有个小伙伴通过私信问了我一个问题,谷歌支付5.0版本怎么获取订阅商品的优惠价格。下面介绍下如何获取订阅商品的优惠价格。
获取优惠内容
根据官方文档描述,我理解的是5.0的SDK中,获取商品返回的商品列表中,一个订阅的ProductDetail
里会包含多个订阅对象SubsriptionOfferDetails
,分别对应不同的优惠。于是我进行了如下尝试:
- 在后台创建订阅商品
我创建了一个订阅商品,包含了一个基础方案和3个优惠方案,优惠方案中10%折扣设置了条件,条件为之前没有订阅过任何商品,但是我的账号之前已经测试过订阅,因此这个优惠无法获取。
- 根据商品id获取商品
如何获取商品已经在Android Google支付接入中介绍过,这里不赘述。
效果如图:
可以看到确实如官方文档描述的那样,获取到的结果中有仅有一个ProductDetail
,并包含了3个SubscriptionOfferDeatils
,其中的PricingPhase
中包含的价格分别有30、24、22.5,恰好对应我在后台配置的基础,20%折扣,25%折扣的方案。