
– 我正在初始化一个LocationClIEnt,使用ConnectionCallbacks等等……
– 然后,我在上面调用“connect()”.
– 在我的“onConnected”方法中,我调用myLocationClIEnt.getLastLocation(),这会使应用程序在某些人设备上崩溃,但有异常:
“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()从客户端获取最后的已知位置.但是,如果至少有一个客户端连接到它,则融合位置提供程序将仅保留后台位置.一旦第一个客户端连接,它将立即尝试获取位置.如果您的活动是第一个客户端连接,并调用getLastLocation()在onConnected(马上),可能没有足够的时间在第一位置进来,这将导致位置被空.
要解决此问题,您必须等待(不确定),直到提供程序获取位置,然后调用getLastLocation(),这是不可能知道的.
另一个(更好)的选择是实现com.Google.androID.gms.location.LocationListener接口接收周期性位置更新(并关闭它一旦你的第一次更新).
public class MyActivity extends Activity implements ConnectionCallbacks,OnConnectionFailedListener,LocationListener {// . . . . . . . . more stuff here LocationRequest locationRequest;LocationClIEnt locationClIEnt;@OverrIDeprotected 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 @OverrIDepublic 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@OverrIDepublic voID onLocationChanged(Location location) { locationClIEnt.removeLocationUpdates(this); // Use the location here!!!} 在此代码中,您将检查客户端是否已具有最后一个位置(在onConnected中).如果没有,您就会请求更新位置,并在获得更新后立即关闭请求(在onLocationChanged()回调中).
更新:
很多时候,用户将禁用位置服务(以节省电池或隐私原因).在这种情况下,上面的代码仍然会请求位置更新,但onLocationChanged永远不会被调用.您可以通过检查用户是否已禁用位置服务来停止请求.
如果您的应用要求他们启用位置服务,您可能希望显示消息或祝酒.很遗憾,无法检查用户是否在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(),Toast.LENGTH_SHORT).show();}else if (location == null && locationEnabled) { locationClIEnt.requestLocationUpdates(locationRequest,this);} 特别感谢Rahul Jiresal.
总结以上是内存溢出为你收集整理的android – LocationClient未在“onConnected”方法中连接全部内容,希望文章能够帮你解决android – LocationClient未在“onConnected”方法中连接所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)