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


74

因此,我发现关于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()怎么可能?

编辑:

由于没有人甚至可以凭借声誉悬赏来回答这个问题,因此我决定将其作为错误报告给Google。接下来发生的事情令我惊讶。Google对我的报告的官方回答:

“该网站针对的是与AOSP Android源代码和开发人员工具集有关的开发人员问题,而不是针对Google应用或服务(例如Play服务,GMS或Google API)的问题。不幸的是,似乎没有合适的位置报告Play服务的错误我只能说不是这个网站,抱歉。请尝试在Google产品论坛上发布。”

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

是的,我看了Google产品论坛,却找不到任何可发布此内容的主题,所以此刻我感到困惑和困惑。

行星上的任何人都可以帮助我吗?

编辑:

pastebin中的完整代码


您是否还可以在onConnectionSuspended()中添加一些日志记录,以查看是否在任何时候调用了它?
Anti Veeranna

@AntiVeeranna我也从未在该函数的onConnectionSuspended()上进行过日志记录。
亚当·瓦赫吉

您还可以发布创建mGoogleApiClient的代码吗?
Anti Veeranna

@AntiVeeranna在pastebin中添加了代码
Adam Varhegyi 2015年

1
@Dima如iheanyi所说:“尝试将googleApiClient创建的内容移至onCreate,看看是否得到相同的行为。” 这样可以确保只有一个实例会从googleApiClient中诞生,并且您的服务不会再包含错误的引用。
亚当·瓦赫吉

Answers:


85

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

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

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



嗨@iheanyi 我正在MainActivity的onCreate()方法上创建“ googleApiClient”对象。但是我在某些设备上收到此错误。您能说些什么?
Sattar Hummatli

@SattarHummatli很难说。这个问题中的情况可能不是某人可能最终导致此错误的唯一方法。我首先要检查您是否没有类似的竞争条件-例如,请确保仅在一个地方创建googleApiClient。如果仍然有问题,请尝试将最少的完整和可验证的代码示例放在一起然后提出问题。然后用链接对我发表评论,然后看看。
iheanyi

2

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

我已将googleApiClient声明为静态。这可以防止android关闭服务。


2

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



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

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

您可以在设置标记之前跳过断开连接和连接的操作,该标记在获得许可之前为true,并且在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;
                    }
                });
    }

我们还可以单独拆分执行权限,如果授予权限,则进行任务调用。好的,我要承认我正在使用一个片段,然后我重新安装了该应用程序,甚至按权限旋转了屏幕,并且一旦被授予,结果就会显示出来。我希望这对其他人有帮助。

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


-1

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


-4

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


9
重复接受的答案对任何人都无济于事,您只会制造噪音
Tim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.