Android 杂记—GAID和谷歌支付订阅优惠

798 阅读3分钟

本文记录一下如何获取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版本怎么获取订阅商品的优惠价格。下面介绍下如何获取订阅商品的优惠价格。

获取优惠内容

企业微信截图_16677058478613.png

根据官方文档描述,我理解的是5.0的SDK中,获取商品返回的商品列表中,一个订阅的ProductDetail里会包含多个订阅对象SubsriptionOfferDetails,分别对应不同的优惠。于是我进行了如下尝试:

  • 在后台创建订阅商品

企业微信截图_16677061122197.png

企业微信截图_16677062426352.png

我创建了一个订阅商品,包含了一个基础方案和3个优惠方案,优惠方案中10%折扣设置了条件,条件为之前没有订阅过任何商品,但是我的账号之前已经测试过订阅,因此这个优惠无法获取。

  • 根据商品id获取商品

如何获取商品已经在Android Google支付接入中介绍过,这里不赘述。

效果如图:

企业微信截图_16677086251670.png

可以看到确实如官方文档描述的那样,获取到的结果中有仅有一个ProductDetail,并包含了3个SubscriptionOfferDeatils,其中的PricingPhase中包含的价格分别有30、24、22.5,恰好对应我在后台配置的基础,20%折扣,25%折扣的方案。