通过Kotlin编程获取Android广告ID

20jt8wwn  于 2023-08-01  发布在  Android
关注(0)|答案(3)|浏览(138)

我是相当新的android开发,并试图获得广告ID为特定的设备。我发现了一些关于如何做到这一点的堆栈溢出建议:

val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext())
val adId = adInfo?.id

字符串
在工作线程中)。然而,这一直给我“等待服务连接超时”错误。
其他人似乎建议添加以下gradle依赖帮助,但不适合我:

implementation 'com.google.android.gms:play-services-ads-identifiers:17.0.0'
implementation 'com.google.android.gms:play-services-base:17.1.0'


以及拥有

apply plugin: 'com.google.gms.google-services'


我错过了什么才能正确获得广告ID?

laximzn5

laximzn51#

我使用Rxjava来获得帮助,你可以使用Asyntask,协程...

  1. RxJava
fun getAdId() {
    Observable.fromCallable { AdvertisingIdClient.getAdvertisingIdInfo(this).id }
        .subscribeOn(AppScheduler().backgroundThread())
        .observeOn(AppScheduler().mainThread())
        .subscribe(Consumer<String> {
             val adId = it
         }, Consumer<Throwable> {
             // nothing
         })
}

字符串

  • 在app/build.gradle中导入Rxjava:

实现'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
1.使用Kotlin的协程:

GlobalScope.launch {
    val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
    Log.d("text", adInfo.id ?: "unknown")
}

ajsxfq5m

ajsxfq5m2#

如果有人想知道(像我一样)为什么他们得到

"Calling this from your main thread can lead to deadlock"

字符串
当试图从使用viewModelScope和挂起函数读取它时。以下是您需要做的事情:
因为viewModelScope默认使用Dispatchers.Main,你需要它抛出这个错误。

选项一:

启动时传递上下文

viewModelScope.launch(Dispatchers.Default){
  // call your suspend function from here
}


但是在这种情况下,当你想在主线程上做一些工作时,你需要做一些工作。

选项2(我更喜欢这个):

suspend函数中使用CoroutineContext

suspend fun getAdId(): String? {
        return withContext(Dispatchers.Default) {
                try {
                    AdvertisingIdClient.getAdvertisingIdInfo(context).id
                } catch (exception: Exception) {
                    null // there still can be an exception for other reasons but not for thread issue
                }
            }
    }

oyt4ldly

oyt4ldly3#

尝试使用以下代码:

fun getAdvertisingId(context: Context, callback: (advertisingId: String?) -> Unit) {
        Thread(Runnable {
            try {
                val info = AdvertisingIdClient.getAdvertisingIdInfo(context)
                val id = info.id
                callback(id)
            } catch (e: Exception) {
                callback(null)
            }
        }).start()
    }

字符串

相关问题