GoogleApiClient投掷" GoogleApiClient尚未连接" AFTER onConnected函数被调用

时间:2015-03-30 10:32:16

标签: android google-play-services google-api-client android-googleapiclient

所以我发现GoogleApiClient对我来说不太清楚。 GoogleApiClient 有一个名为 onConnected 的功能,该功能在客户端连接时运行

我有自己的函数叫做: startLocationListening ,最终在GoogleApiClient的onConnected 函数上调用。

所以我的 startLocationListening函数无法在没有GoogleApiClient连接的情况下运行。

代码和日志:

@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

在此之后我得到了例外。

我在这里遗漏了什么吗?我收到了#34; connected"我跑了我的功能,我得到了错误"没有连接"这是什么?另外一个令人讨厌的事情是:我现在使用这个位置服务已经好几个星期了,从来没有出现过这个错误。

E D I T:

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

@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() == falseonConnected()怎么可能?

E D I T:

由于没有人能够以声誉奖励回答这个问题,我决定将此报告为谷歌的一个错误。接下来发生的事情真让我感到惊讶。 Google对我的报告的正式回答:

  

"本网站适用于AOSP Android源代码的开发人员问题   代码和开发人员工具集,而不是Google应用或服务   播放服务,GMS或Google API。不幸的是,似乎并没有   是一个适当的地方报告Play服务的错误。我所能做的一切   说是这个网站不是,对不起。尝试在Google上发帖   产品论坛代替。 "

完整问题report here.(我希望他们不会因为它的愚蠢而删除它)

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

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

E D I T:

pastebin

中的完整代码

9 个答案:

答案 0 :(得分:85)

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

让我们说你的服务被触发两次。将创建两个googleApiClient对象,但您只能引用一个。如果您的引用没有执行其对onConnected()的回调,那么您将在该客户端连接,但您实际拥有的引用的客户端仍然可以是未连接的。

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

答案 1 :(得分:2)

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

我已经宣布googleApiClient是静态的。这阻止了android关闭服务。

答案 2 :(得分:0)

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

  

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

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

答案 3 :(得分: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();
       }

答案 4 :(得分: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为false。

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;
                    }
                });
    }

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

  • 您不必卸载该应用。只需转到设置/应用程序管理员/您的应用程序/权限,然后关闭,然后再次测试应用程序。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

我偶然遇到这个问题,但在oncreate和onresume中有googleApiClient.connect()。刚从oncreate中删除它。

答案 8 :(得分:-4)

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