75

所以我发现了一些关于 GoogleApiClient 对我来说不是很清楚的东西。 GoogleApiClient有一个名为onConnected的函数,它在客户端连接时运行(当然)。

我得到了我自己的函数:startLocationListening,它最终被 GoogleApiClient 的 onConnected函数调用。

因此,如果没有 GoogleApiClient 连接,我的startLocationListening 函数将无法运行。

代码和日志:

@Override
public void onConnected(Bundle bundle) {
    log("Google_Api_Client:connected.");
    initLocationRequest();
    startLocationListening(); //Exception caught inside this function
}

...

private void startLocationListening() {
    log("Starting_location_listening:now");

    //Exception caught here below:
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
   }

例外是:

03-30 12:23:28.947: E/AndroidRuntime(4936):     java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

我的调试日志还说调用了 onConnected 函数

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

在此之后,我得到了例外。

我在这里错过了什么吗?我得到了“已连接”的响应我运行了我的 func,但我得到了错误“未连接”这是什么?另外一件烦人的事情是:我使用这个定位服务已经有好几个星期了,从来没有出现过这个错误。

编辑 :

我添加了一个更具体的日志输出,让我大吃一惊,看看这个:

@Override
    public void onConnected(Bundle bundle) {

        if(mGoogleApiClient.isConnected()){
            log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
        }
        else{
            log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
        }

        initLocationRequest();
        startLocationListening();
    }

在这种情况下记录输出:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

是的,我刚mGoogleApiClient.isConnected() == false进去onConnected()怎么可能?

编辑:

由于即使有声誉赏金也没有人能回答这个问题,我决定将此作为一个错误报告给谷歌。接下来发生的事情让我感到非常惊讶。谷歌对我的报告的官方回答:

“这个网站是针对 AOSP Android 源代码和开发者工具集的开发者问题,而不是 Google 应用程序或服务,例如 Play 服务、GMS 或 Google API。不幸的是,似乎没有合适的地方来报告 Play 服务的错​​误. 我只能说这个网站不是它,对不起。试着在谷歌产品论坛上发帖。“

完整的问题报告在这里。(我希望他们不会仅仅因为它很愚蠢而将其删除)

所以是的,我看了一下谷歌产品论坛,只是找不到任何主题来发布这个东西,所以现在我很困惑和卡住了。

地球上的任何人都可以帮助我吗?

编辑:

pastebin中的完整代码

4

9 回答 9

86

我刚刚注意到您正在 onStartCommand() 中创建 googleApiClient。这似乎是个坏主意。

假设您的服务被触发了两次。将创建两个 googleApiClient 对象,但您只能引用一个。如果您没有其引用的客户端执行其对 onConnected() 的回调,您将在该客户端中连接,但您实际拥有其引用的客户端仍可能未连接。

我怀疑这是怎么回事。尝试将您的 googleApiClient 创建移动到 onCreate 并查看您是否得到相同的行为。

于 2015-04-03T22:55:57.427 回答
3

我有同样的错误,但我的问题与 iheanyl 的回答不同:

我已将 googleApiClient 声明为静态的。这阻止了android关闭服务。

于 2015-09-28T20:30:19.577 回答
2

我遇到了这个问题,我通过将 googleApiClient 声明为静态对象来解决它

于 2017-12-20T16:34:40.627 回答
0

https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

无论状态如何,您都应该在 Activity 的 onCreate(Bundle) 方法中实例化一个客户端对象,然后在 onStart() 中调用 connect(),在 onStop() 中调用 disconnect()。

GoogleApiClient 的实现似乎仅针对单个实例而设计。最好在 onCreate 中只实例化一次,然后使用单个实例执行连接和断开连接。

于 2017-07-19T04:35:55.653 回答
0

在 onStart() 方法中调用 connect() 方法

 @Override
       protected void onStart() {
           super.onStart();

           // Call GoogleApiClient connection when starting the Activity
           googleApiClient.connect();
       }

       @Override
       protected void onStop() {
           super.onStop();

           // Disconnect GoogleApiClient when stopping Activity
           googleApiClient.disconnect();
       }
于 2017-08-22T14:25:02.573 回答
0

我想我找到了问题的根源,它与 API 无关。每次安装该应用程序时,我都会遇到此问题。顺便说一句,就像最受欢迎的评论一样,我在暂停和恢复时只有一个 googleApiClient。我注意到的是弹出获取地理位置访问权限的权限请求。正如您在活动中所知道的,这将变成暂停,一旦弹出窗口消失,它就会恢复您的活动。很可能您的 googleClient 也被链接到这些事件以断开和连接。一旦接受许可并且您即将执行 googleApiClient 任务,您就可以判断没有连接。

 if(googleApiClient.isConnected()){

        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {

                 if (granted) {
                        //here it could be client is already disconnected!!     
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                    }
                });
    }

您可以跳过断开连接和连接,因为您设置了一个标志,该标志在许可之前为真,一旦 googleApiClient 任务完成或granted为假。

if(googleApiClient.isConnected()){
        isRequestingPermission = true;
        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {
                    if (granted && googleApiClient.isConnected()) {
                        //Once the task succeeds or fails set flag to false
                        //at _geolocateAddress
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                        isRequestingPermission = false;
                    }
                });
    }

我们也可以单独拆分做权限,如果被授予,则进行任务调用。好的,我要承认我正在使用一个片段,我重新安装了应用程序,甚至在权限上旋转了屏幕,一旦授予,结果就出现了。我希望这对其他人有所帮助。

  • 您不必卸载该应用程序。只需转到设置/应用程序管理器/您的应用程序/权限并关闭任何权限,然后再次测试该应用程序。
于 2017-10-01T22:02:07.833 回答
0

将 GoogleApiClient 从 onStartCommand 移动到 onCeate 解决了我的问题

于 2020-05-29T09:32:51.097 回答
-1

当我不小心在 oncreate 和 onresume 中使用 googleApiClient.connect() 时遇到了这个问题。刚刚从 oncreate 中删除它。

于 2016-05-31T07:03:51.847 回答
-4

将 googleApi 创建移动到 onCreate 为我解决了这个问题。

于 2016-05-16T19:36:13.497 回答