用户退出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
相关产品推荐
相关产品推荐

