获取广告商ID时出错。

12

我注意到我的谷歌分析电子商务数据在我的安卓应用中未正确传递,而所有其他分析数据(屏幕查看、异常)都已正确发布。

我已经开始了关于这个话题的悬赏,但是深入挖掘后,我发现日志中出现了一些错误:

获取广告标识符时出错:java.io.IOException: java.util.concurrent.TimeoutException:超时等待服务连接

成功绑定到服务但从未收到onServiceConnected回调

我怀疑这些错误是由play-services级别的某些问题造成的,这就是我开设新主题的原因。

由于以上错误在提交之前出现在日志中,我的理论是由于它们,我的电子商务数据未被正确发布。这里有人见过类似的情况吗?我可以尝试什么来修复它?

请注意我正在使用以下版本(从build.gradle中获取)

compile 'com.google.android.gms:play-services-analytics:9.4.0'
compile 'com.google.android.gms:play-services-ads:9.4.0'

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

和gradle插件

classpath 'com.android.tools.build:gradle:2.2.0-beta1'

嗨,Marco。我在使用GMS 9.4.0时遇到了一些问题,但是没有找到解决方法...我的应用程序在显示以下日志消息后启动时会冻结:Error getting advertiser id: java.io.IOException: java.util.concurrent.TimeoutException: Timed out waiting for the service connection Successfully bound to service but never got onServiceConnected callback - DimParf
嗯,我的应用程序没有冻结,但仍然无法将电子商务数据交付给分析系统... - Marco Zanetti
我在这里找到了一个相关的报告:https://groups.google.com/forum/#!topic/google-admob-ads-sdk/UwGncnJnNS4 看起来问题在gms 9.8中仍然存在。 - rockgecko
各位好,这个问题有任何更新吗?我在使用标签管理器11.8.0时遇到了这个问题。但是我完全没有看到任何解决方案。 - Oleksandr Berdnikov
4个回答

1
我通过在 gradle.build 文件的 dependencies 块中添加以下内容来修复了此错误:
implementation 'com.google.android.gms:play-services-base:16.0.1'

0
在我的情况下,另一个错误(一个“未找到虚拟方法”的错误)阻止了这个过程并导致超时。解决了这个问题后,广告 ID 被成功检索。

0

我遇到了以下错误

java.util.concurrent.TimeoutException: 超时等待服务连接

将调用方法移至非主线程后,该错误已被修复。我不确定这个解决方案是否能帮到你,但你可以尝试一下。


我遇到了这个异常,但是我是从一个suspend函数中调用的,并且使用withContext(Dispatchers.IO)来调用getAdvertisingIdInfo()。我已经验证它不在主线程上。 - casolorz

0
从我的最新测试中看来,当尝试从主线程获取Android ID时,onServiceConnected没有被调用。这可能会导致死锁(如@DimPar的情况)和超时异常,当你试图通过在Thread.join上设置超时来防止死锁时。 似乎Android不允许外部SDK创建单独的线程(即使它们直接通过创建一个新线程并启动它来做到这一点)。 换句话说,如果你使用一个SDK,即使它应该工作,也会尝试获取Android ID,它也不会起作用。解决这个问题的方法是在活动中创建一个单独的线程来调用所有外部SDK函数。 以下是我个人经验的一个例子。
下面的代码块会导致死锁:
public class MainActivity extends AppCompatActivity {
    static boolean doOnce = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if( doOnce ) {
            ExternalSDKClass.StartInitialization();
            doOnce = false;
        }
}

以下代码块有效

public class MainActivity extends AppCompatActivity {

    Thread ExternalSDKThread = new Thread() {
        @Override
        public void run() {
            try {
                ExternalSDKClass.StartInitialization();
            } catch (Exception e) {
                Log.i("SDK ERROR", "getAdvertisingIdInfo Exception: " + e.toString());
            }
        }
    };
    //---------------------------------

    static boolean doOnce = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if( doOnce ) {
            ExternalSDKThread.start();
            doOnce = false;
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接