- 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/
我在我的 Android 应用程序中使用 Google Maps Android API v2 LocationClient: http://developer.android.com/referen
您是否需要连接的 LocationClient 来检测用户是否离开了地理围栏?在我当前的代码中,我连接了 LocationClient,建立了地理围栏,然后断开了 LocationClient。然而,
我正在使用 LocationClient 来检索当前用户位置,并且我正在尝试创建一个具有距离值和更新间隔的 LocationRequest。 我的代码当前请求按更新间隔更新位置: mL
我正在使用效果很好的 LocationClient。现在我正在尝试创建模拟位置 (setMockMode(true) + setMockLocation(mockLoc)。但是我的 LocationL
所以基本上这是我的问题,我一直在关注此链接 http://developer.android.com/training/location/retrieve-current.html 而且似乎 ecli
来自GooglePlayServicesClient.ConnectionCallbacks当 LocationClient 断开连接时,应该调用 onDisconnected 文档。根据我的测试,我
我正在尝试为个人项目实现 LocationClient,不幸的是,在调用 LocationClient 的 connect() 方法时,它总是失败。我在模拟器上试过,然后在安卓设备上试过。关于 and
我正在使用 LocationClient 每分钟获取当前位置: mLocationRequest = LocationRequest.create(); mLocationRequest.setPri
我正在使用 AndroidStudio 并尝试使用 googleplayservices 进行地理编码。 我遵循了 android 教程: http://developer.android.com/g
我正在使用 google play services api 在我的应用程序中获取位置更新。但是,出于某种原因,当客户端连接时,client.getLastLocation() 不会更改其值。只有通过
我如何使用 locationclient 类和 requestLocationUpdates(LocationRequest, LocationListener) 在 android 中获取位置更新?
我正在尝试使用新的谷歌位置服务更新旧教程。我直接使用来自谷歌教程的代码,但是行 mLocationClient = new LocationClient(this,this,this);返回错误构造函
我需要知道从此方法返回的 Location 对象的更新频率以及它是基于时间、距离还是其他? 最佳答案 根据getLastLocation()文档它返回已知位置。 我认为它存储 LocationClie
自融合位置提供程序发布以来,我一直在使用它,我对它非常满意(比旧系统好得多)。但是当结合使用地理围栏和 LocationClient.lastKnownLocation() 时,我遇到了一个特殊问题。
我正在开发一个包含服务和 Activity 的应用程序。该服务使用 LocationClient 对象每分钟请求当前位置。该 Activity 使用另一个 LocationClient 对象在单击按钮
我正在尝试编写一个在后台运行并从 LocationClient (Google Map API Android V2) 接收位置更新的简单 Android 服务。问题是当屏幕关闭时,我的服务不再接收位
我正在考虑设置两个单独的警报来每小时收集用户的位置数据,一个警报每 59 分钟响一次以“连接”客户端,另一个警报实际获取位置然后断开客户端连接。 就电池生命周期而言,如果获取用户位置将成为应用程序的主
我正在使用新的 Google LocationClient 来检索地理位置。我需要获得每个点(位置)的速度。 我现在正在做的是: if (mLocationClient == null) {
是否可以使用 GooglePlayServices 或 LocationClient? 最佳答案 我想我来不及回答这个问题了。但没关系。因此,借助新的 API LocationSettingsRequ
更新到 Google Play 服务 6.5.87 后,我的应用由于缺少 LocationCLient 类而无法编译。 documentation link目前已损坏(404 Not Found) 我
我是一名优秀的程序员,十分优秀!