GoogleApiClient 在调用 onConnected 函数后抛出“GoogleApiClient 尚未连接”
Posted
技术标签:
【中文标题】GoogleApiClient 在调用 onConnected 函数后抛出“GoogleApiClient 尚未连接”【英文标题】:GoogleApiClient is throwing "GoogleApiClient is not connected yet" AFTER onConnected function getting called 【发布时间】:2015-06-03 08:00:10 【问题描述】:所以我发现了一些关于 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
在这之后我得到了异常。
我在这里遗漏了什么吗?我得到了“已连接”的响应我运行了我的 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.
是的,我刚刚在onConnected()
中找到了mGoogleApiClient.isConnected() == false
,这怎么可能?
编辑:
由于即使有声誉赏金也没有人能回答这个问题,我决定将此作为一个错误报告给 Google。接下来发生的事情让我感到非常惊讶。 谷歌对我的报告的官方回答:
“此网站用于解决 AOSP Android 源代码的开发者问题 代码和开发人员工具集,而不是 Google 应用或服务,例如 播放服务、GMS 或 Google API。不幸的是,似乎没有 是报告 Play 服务错误的合适场所。尽我所能 说的是这个网站不是它,对不起。尝试在 Google 上发帖 而是产品论坛。 "
完整的问题report here.(我希望他们不会因为它很傻而删除它)
所以是的,我查看了 Google 产品论坛,但找不到任何主题可以发布此内容,所以目前我感到困惑和卡住。
地球上有人可以帮我解决这个问题吗?
编辑:
完整代码在pastebin
【问题讨论】:
您能否在 onConnectionSuspended() 中添加一些日志记录,以查看是否随时调用? @AntiVeeranna 我在 onConnectionSuspended() 上也有记录,因为该函数从未被调用过。 您能否也发布创建 mGoogleApiClient 的代码? @AntiVeeranna 在 pastebin 中添加代码 @Dima 正如 iheanyi 所说:“尝试将您的 googleApiClient 创建移动到 onCreate,看看您是否得到相同的行为。”它确保只有一个实例会从 googleApiClient 生成,并且您的服务将不再持有错误的引用。 【参考方案1】:我刚刚注意到您正在 onStartCommand() 中创建 googleApiClient。这似乎是个坏主意。
假设您的服务被触发了两次。将创建两个 googleApiClient 对象,但您只能引用一个。如果您没有其引用的客户端执行其对 onConnected() 的回调,您将在该客户端中连接,但您实际拥有其引用的客户端仍可能未连接。
我怀疑这是怎么回事。尝试将您的 googleApiClient 创建移动到 onCreate 并查看您是否得到相同的行为。
【讨论】:
是的,我认为你说得对! developer.android.com/reference/android/app/… 嗨@iheanyi。我正在 MainActivity 的 onCreate() 方法上创建我的“googleApiClient”对象。但我在某些设备上收到此错误。对此你有什么想说的? @SattarHummatli 很难说。这个问题中的情况可能不是某人最终出现此错误的唯一方式。我会首先检查您是否没有类似的竞争条件 - 例如,确保您只在一个地方创建 googleApiClient。如果您仍有问题,请尝试将minimal complete and verifiable code example 放在一起并发布问题。然后用链接回复我的评论,我会看看。【参考方案2】:我有同样的错误,但我的问题与 iheanyl 的回答不同:
我已将 googleApiClient 声明为静态。这阻止了 android 关闭服务。
【讨论】:
【参考方案3】:我遇到了这个问题,我通过将 googleApiClient 声明为静态对象来解决它
【讨论】:
【参考方案4】:https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html
您应该在 Activity 的 onCreate(Bundle) 方法中实例化一个客户端对象,然后在 onStart() 中调用 connect(),在 onStop() 中调用 disconnect(),无论状态如何。
GoogleApiClient 的实现似乎仅针对单个实例而设计。最好在 onCreate 中只实例化一次,然后使用单个实例执行连接和断开连接。
【讨论】:
【参考方案5】:在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();
【讨论】:
【参考方案6】:我想我找到了问题的根源,它与 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;
);
我们也可以单独拆分执行权限,如果被授予,则进行任务调用。好的,我要承认我正在使用一个片段,我重新安装了应用程序,甚至在权限上旋转了屏幕,一旦授予,结果就出现了。我希望这对其他人有所帮助。
您不必卸载该应用程序。只需转到设置/应用程序管理器/您的应用程序/权限并关闭所有权限,然后再次测试应用程序。【讨论】:
【参考方案7】:将 GoogleApiClient 从 onStartCommand 移动到 onCeate 解决了我的问题
【讨论】:
【参考方案8】:我在 oncreate 和 onresume 中偶然发现了 googleApiClient.connect() 时遇到了这个问题。刚刚从 oncreate 中删除它。
【讨论】:
【参考方案9】:将 googleApi 创建移动到 onCreate 为我解决了这个问题。
【讨论】:
重复接受的答案对任何人都没有用,你只会制造噪音以上是关于GoogleApiClient 在调用 onConnected 函数后抛出“GoogleApiClient 尚未连接”的主要内容,如果未能解决你的问题,请参考以下文章
GoogleApiClient onConnectionSuspended ,我应该再次调用 mGoogleApiClient.connect() 吗?
不知道为啥应用程序在 GoogleApiClient.connect() 上被强制关闭
GoogleApiClient.isConnected() 在飞行模式下返回 true