- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有人遇到过这个问题:- 我正在用 ConnectionCallbacks 等初始化 LocationClient...- 然后,我在上面调用“connect()”。- 在我的“onConnected”方法中,我调用了 myLocationClient.getLastLocation(),这使得应用程序在某些人的设备上崩溃,但异常(exception)情况:
"Fatal Exception: java.lang.IllegalStateException Not connected. Call connect() and wait for onConnected() to be called."
有什么想法吗?
部分代码如下:
myLocationClient = new LocationClient(this, new ConnectionCallbacks() {
@Override
public void onDisconnected() {
//Do some stuff here
}
@Override
public void onConnected(Bundle arg0) {
if(myLocationClient.getLastLocation() != null) {
//Do some other stuff here
}
}
}, new OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult arg0) {
//Do other stuff here
}
});
myLocationClient.connect();
应用程序在“onConnected”方法的第一行崩溃。
对于想要堆栈的人来说,它是:
java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
at com.google.android.gms.internal.k.B()
at com.google.android.gms.internal.bh.a()
at com.google.android.gms.internal.bh$c.B()
at com.google.android.gms.internal.bg.getLastLocation()
at com.google.android.gms.internal.bh.getLastLocation()
at com.google.android.gms.location.LocationClient.getLastLocation()
at com.myAppPackage.onConnected(AroundMeActivity.java:321)
at com.google.android.gms.internal.k.y()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$f.a()
at com.google.android.gms.internal.k$b.D()
at com.google.android.gms.internal.k$a.handleMessage()
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(NativeStart.java)
最佳答案
locationClient.getLastLocation()
从客户端获取最后一个已知位置。但是,如果至少有一个客户端连接到 Fused Location Provider,则 Fused Location Provider 只会维护后台位置。一旦第一个客户端连接,它将立即尝试获取位置。如果您的 Activity 是第一个连接的客户端并且您立即在 onConnected()
中调用 getLastLocation()
,那么第一个位置可能没有足够的时间进入。这将导致位置为空。
要解决此问题,您必须(不确定地)等待提供者获取位置,然后调用 getLastLocation()
,这是不可能知道的。
另一个(更好的)选择是实现 com.google.android.gms.location.LocationListener
接口(interface)以接收定期位置更新(并在获得第一次更新后将其关闭)。
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
// . . . . . . . . more stuff here
LocationRequest locationRequest;
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . . . other initialization code
locationClient = new LocationClient(this, this, this);
locationRequest = new LocationRequest();
// Use high accuracy
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
locationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation();
if (location == null)
locationClient.requestLocationUpdates(locationRequest, this);
else
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
locationClient.removeLocationUpdates(this);
// Use the location here!!!
}
在此代码中,您正在检查客户端是否已经拥有最后一个位置(在 onConnected 中)。如果没有,您将请求位置更新,并在获得更新后立即关闭请求(在 onLocationChanged()
回调中)。
更新:
很多时候,用户会禁用位置服务(以节省电池或隐私原因)。在这种情况下,上面的代码仍会请求位置更新,但永远不会调用 onLocationChanged
。您可以通过检查用户是否已禁用定位服务来停止请求。
如果您的应用需要它们启用定位服务,您可能希望显示一条消息或 toast 。遗憾的是,无法检查用户是否在 Google 的位置服务 API 中禁用了位置服务。为此,您将不得不求助于 Android 的 API。
在您的 onCreate 方法中:
LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationEnabled = false;
Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;
然后像这样在 onConnected 方法中使用 locationEnabled 标志:
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
特别感谢 Rahul Jiresal。
关于android - LocationClient 未在 "onConnected"方法中连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015820/
我为 Google LocationClient API 实现了这个 onConnected 回调: @Override public void onConnected(Bundle arg0) {
我只是想教自己关于Android音频开发的知识,而对于为什么在这里既不调用connectionCallback的onConnected方法也不对onConnectionFailed方法感到困惑。实例化
在我的集线器中,我有这样的东西(伪代码): public override Task OnConnected() { var isLegal = Authorize(); if (!i
我正在尝试覆盖 OnConnected() , OnDisconnected()方法,但我得到: OnConnected()': no suitable method found to overrid
使用“express”我设置了这个中间件: app.use(function(request, response, next) { console.log(request.headers["u
我有以下内容: public override Task OnConnected() { HandleConnectionAsync(Context).Wait();
我正在使用 onConnection Hook 和一些模板助手来执行一些统计操作。但现在,当我是注册用户时,我不想排除这些操作。问题是,我无法在 onConnection Hook 中使用 Meteo
我正在尝试通过 onConnected() 方法获取我的当前位置。但不幸的是 onMapReady() 被提前调用。因此,我的变量 currentLatitude 和 currentLongitude
中心代码 public class TestHub : Hub { public void Message(string message) {
很简单的问题。为什么刚刚连接的客户端没有收到任何消息,而其他所有客户端都收到了广播?发送连接消息的客户端的正确方法是什么? protected override void OnConnected(Ht
我正在尝试创建一个板,用户可以在其中动态添加 block 并将 block 与链接连接起来。 (类似 this 但动态)我正在使用 JointJs 框架,到目前为止一切都按预期工作,但我需要在用户连接
我今天一直在试验 SignalR,它真的很简洁。基本上我想要实现的是: 一旦设备连接上,它就应该向第一个设备发送一条消息。如果连接的设备多于 1 个,我想发送两条消息。一对所有除了最后一个连接的客户端
我有一个可穿戴设备,我正在尝试连接到 GoogleApiClient,但从未调用回调(onConnected、onConnectionSuspended 或 onConnectionFailed)。其
Meteor 客户端有 onConnection 钩子(Hook)吗?这是我的问题:我正在尝试检测 Meteor 何时重新连接到服务器以基于参数以编程方式重新订阅某些数据。 Meteor其实是自动重新
因此,我有自定义位置服务类,我想从中获取最后已知的位置。我有可能在连接 GoogleApiClient 之前调用 getLastKnownLocation(),所以我必须等待它然后调用 getLast
我正在编写一个使用 Google 定位服务的应用程序。据我了解,当我在 LocationClient 对象上调用 connect() 方法时,实现 GooglePlayServicesClient.C
当用户点击广告地理围栏按钮时,我想在用户的当前位置添加地理围栏。但是,在使用融合 api 客户端后,它声明尚未连接。这是我的代码- import android.Manifest; import an
有没有人遇到过这个问题:- 我正在用 ConnectionCallbacks 等初始化 LocationClient...- 然后,我在上面调用“connect()”。- 在我的“onConnecte
所以我有这段代码: package com.entu.bocterapp; import android.content.Context; import android.location.Locati
当我在 Activity 中使用 GoogleApiClient 但将其移至 Service 并且未调用 onConnected 时正在工作。 public class StepsMonitoring
我是一名优秀的程序员,十分优秀!