【问题标题】:GoogleApiClient.connect()' was expected to be of type interface but was found to be virtualGoogleApiClient.connect()' 应该是接口类型,但被发现是虚拟的
【发布时间】:2015-10-12 05:22:41
【问题描述】:

所以我像这样连接到 google api 客户端。

        googleApiClient = new GoogleApiClient.Builder(context)
        .addApi(LocationServices.API)
        .addApi(ActivityRecognition.API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();
        googleApiClient.connect();

我在多个地方都使用了完全相同的代码,并且运行良好。这与您在他们的教程中看到的没有什么不同。但是现在:

java.lang.IncompatibleClassChangeError: 方法 'void com.google.android.gms.common.api.GoogleApiClient.connect()' 是 预期是接口类型,但发现是类型 虚拟(“java.lang.reflect.ArtMethod”的声明出现在 /system/framework/core-libart.jar)

堆栈跟踪报告的行是:

googleApiClient.connect();

使用播放服务 8.1

compile 'com.google.android.gms:play-services:8.1.0'

有人有这个吗?

【问题讨论】:

  • 编译时使用的 JAR 文件与执行时使用的 JAR 文件版本不同。
  • 谢谢。我做了一个清洁和重建仍然一样。关于如何确保 jar 文件得到更新的任何建议?
  • 我没有说清理或重建。这些都不会解决版本控制问题。我有和以前一样的建议。如何实现是另一个问题。
  • 但是您的建议是什么?您只是说“您编译的 JAR 文件与您执行的 JAR 文件的版本不同”?我没有看到我正在使用 Android Studio 编译并在手机上运行的建议。无法替换手机上的jar文件。

标签: java android


【解决方案1】:

问题来自您的应用所依赖的库之一,该库本身也依赖于 Google Play 服务。

该库使用的是旧版本的 Google Play 服务 SDK,它仍然依赖于 GoogleApiClient 类是一个接口这一事实。 This has changed in 8.1.0 where it became an abstract class。由于库的传递依赖关系,这破坏了向后兼容性。

查看您使用的库是否也有 8.1.0 的新更新版本,或者如果可能,删除该依赖项。

More explanation can be found here.

【讨论】:

    【解决方案2】:

    这是 Play 服务库 8.1.0 中的错误。通过降级播放服务库解决了这个问题。

    改变

    compile 'com.google.android.gms:play-services:8.1.0'
    

    compile 'com.google.android.gms:play-services:7.8.+'
    

    并且错误不再出现。我的其他代码有效(如问题中所述,因为他们使用的是旧版本的库)这必须在谷歌发布更新之前完成。

    更新: 我在 galex 的另一个答案出现之前写了这个。这是正确的答案。但是如果你找不到存在这些版本冲突的库,或者如果你无法更改这些库依赖项,解决方案是将你的播放版本降级到 7.8

    【讨论】:

    • compile 'com.google.android.gms:play-services:7.8.0' 有效。尽可能避免使用 + 的最佳做法。
    • 我打算自己使用它,但我们知道这不是一个好方法。我们将永远留在 7.8?
    【解决方案3】:
          compile 'com.google.android.gms:play-services:7.8.+'
    compile 'com.google.android.gms:play-services-maps:7.8.+'
    

    10 多个小时后为我解决了!!

    【讨论】:

    • 如果您对为什么需要使用旧版本有任何解释会更好。
    • 我的理由是我的一个库使用 8.4,另一个使用 7.8,因此使用 + 表示在使用时使用任何需要的版本....
    猜你喜欢
    • 2022-06-10
    • 2016-10-22
    • 2018-10-23
    • 1970-01-01
    • 2011-10-28
    • 2014-04-06
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多