You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户退出Ad ID追踪时,应用如何获取通知?

获取用户退出Ad ID追踪通知的实现方案

核心逻辑说明

现在,当用户选择退出广告追踪时,谷歌会将其ID清零,并通知开发者和广告技术公司在后端系统中删除相关信息。

要获取用户的Ad ID追踪状态变化,主要通过Google Play Services提供的AdvertisingIdClient API结合状态监听实现,以下是具体步骤:


1. 添加依赖

在项目的Module级build.gradle中引入广告识别服务依赖:

implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'

2. 基础状态检查

通过异步方式获取当前Ad ID状态(必须在非主线程调用,否则会抛出异常):

private fun checkAdTrackingStatus() {
    Executors.newSingleThreadExecutor().execute {
        try {
            val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
            val isTrackingAllowed = !adInfo.isLimitAdTrackingEnabled
            val currentAdId = adInfo.id
            
            // 对比本地存储的旧状态,若变化则触发后续操作
            val savedStatus = getSavedTrackingStatus() // 从SharedPreferences读取历史状态
            if (isTrackingAllowed != savedStatus) {
                updateSavedTrackingStatus(isTrackingAllowed)
                // 这里可发送状态变更事件到后端,或更新应用内逻辑
            }
        } catch (e: Exception) {
            // 处理异常:Google Play Services未安装/不可用、权限不足等
            e.printStackTrace()
        }
    }
}

3. 实时监听状态变化

用户可能在系统设置中修改追踪选项,通过注册ContentObserver监听设置变化,实时触发状态检查:

private val adTrackingSettingsObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
    override fun onChange(selfChange: Boolean) {
        super.onChange(selfChange)
        // 设置发生变化时重新检查状态
        checkAdTrackingStatus()
    }
}

// 在Activity/Fragment生命周期中注册/注销监听
override fun onResume() {
    super.onResume()
    contentResolver.registerContentObserver(
        Uri.parse("content://com.google.android.gms.ads.settings"),
        true,
        adTrackingSettingsObserver
    )
    // 页面恢复时主动检查一次状态
    checkAdTrackingStatus()
}

override fun onPause() {
    super.onPause()
    contentResolver.unregisterContentObserver(adTrackingSettingsObserver)
}

4. 后台定期同步(可选)

如果需要后台持续同步状态,可使用WorkManager实现周期性检查:

// 构建周期性任务(每1小时执行一次)
val checkTrackingWork = PeriodicWorkRequestBuilder<AdTrackingCheckWorker>(1, TimeUnit.HOURS)
    .build()

// 加入WorkManager队列,避免重复任务
WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
    "AdTrackingCheck",
    ExistingPeriodicWorkPolicy.KEEP,
    checkTrackingWork
)

// Worker类实现
class AdTrackingCheckWorker(appContext: Context, params: WorkerParameters) : Worker(appContext, params) {
    override fun doWork(): Result {
        return try {
            val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
            val isTrackingAllowed = !adInfo.isLimitAdTrackingEnabled
            val savedStatus = getSavedTrackingStatus()
            
            if (isTrackingAllowed != savedStatus) {
                updateSavedTrackingStatus(isTrackingAllowed)
                // 同步状态到后端
            }
            Result.success()
        } catch (e: Exception) {
            e.printStackTrace()
            Result.retry() // 失败后重试
        }
    }
}

注意事项

  • 当用户退出追踪时,获取到的Ad ID会变为空字符串,同时isLimitAdTrackingEnabled返回true
  • 无需申请INTERNET权限,但需确保设备安装了Google Play Services
  • 所有涉及AdvertisingIdClient的调用必须在非主线程执行,避免阻塞UI

内容的提问来源于stack exchange,提问作者user1443721

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:15:18