获取广告客户ID时出错

时间:2016-08-11 09:40:02

标签: java android google-analytics google-play-services google-analytics-v4

我注意到我的Android应用未能正确发送我的Google分析电子商务数据,而所有其他分析数据(屏幕视图,例外)都已正确发布。

我已经打开a bounty about this topic但是进一步挖掘我在logcat中发现了一些错误:

  

获取广告客户ID时出错:java.io.IOException:   java.util.concurrent.TimeoutException:超时等待   服务连接

     

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

我怀疑这些错误是由于某些内容无法在播放服务级别上运行,这就是为什么我要打开一个新主题。

由于上述错误在点击发布之前出现在日志中,我的理论是我的电子商务数据因为它们而未正确发布。这里有人见过这样的东西吗?我可以尝试一下来修复它吗?

请注意我正在使用(取自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'

3 个答案:

答案 0 :(得分:0)

我通过将其添加到dependencies文件的gradle.build块中来解决此错误:

implementation 'com.google.android.gms:play-services-base:16.0.1'

答案 1 :(得分:0)

我遇到以下错误

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

将调用者方法移至非主线程后,该错误已修复。我不确定该解决方案是否可以帮助您,但是您可以查看一下。

答案 2 :(得分:0)

从我最近的测试来看,似乎在尝试从主线程获取 android id 时没有调用 onServiceConnected。当您尝试通过 Thread.join 超时来防止死锁时,它可能会导致死锁(如在 @DimPar 情况下)和超时异常。 似乎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;
        }
}