GoogleApiClient正在抛出“GoogleApiClient尚未连接”后,onConnected函数被调用

所以我发现了一些关于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.cb(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) 

我的debugging日志还说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 

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

我在这里错过了什么? 我得到了“连接”的响应,我跑了我的function,我得到了错误“不连接”这是什么? 另外一个令人讨厌的事情是:我现在使用这个位置服务数周,从来没有得到这个错误。

编辑:

我添加了一个更具体的日志输出,只是打了我的脑海,检查了这一点:

 @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. 

是的,我刚刚在onConnected()获得了mGoogleApiClient.isConnected() == false这怎么可能?

编辑:

由于没有人可以用名誉赏金来回答这个问题,所以我决定把它作为一个bug报告给Google。 接下来是什么真的让我感到惊讶。 Google对我的报告的正式答复:

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

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

所以是的,我看了一下Google产品论坛,只是发现任何话题来发布这个东西,所以目前Iam困惑和卡住。

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

编辑:

完整的代码在pastebin中

我只注意到你正在onStartCommand()中创buildgoogleApiClient。 这似乎是一个坏主意。

假设您的服务被触发了两次。 两个googleApiClient对象将被创build,但你只能参考一个。 如果没有引用的对象执行onConnected()callback,那么将连接到该客户端,但实际上其实际引用的客户端可能仍处于未连接状态。

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

我有同样的错误,但我的问题是从iheanyl的答案不同:

我已经宣布googleApiClient静态。 这阻止了androidclosures服务。

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

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

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

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

我想我find了问题的根源,并且与API无关。 我每次安装应用程序都面临这个问题。 顺便说一句,就像最stream行的评论,我暂停和恢复只有一个googleApiClient。 我注意到,获取地理位置访问的权限请求popup。 正如你在活动中所知道的那样,这将会变成一个暂停,一旦popup消失,它将恢复你的活动。 很可能你的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; } }); } 

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

  • 您不必卸载应用程序。 只需转到设置/应用程序pipe理器/您的应用程序/权限,然后closures,然后再次testing应用程序。

我意外的时候遇到了这个问题,但是在oncreate和onresume中有googleApiClient.connect()。 刚刚删除它oncreate。

将googleApi创build移动到onCreate解决了我的问题。