android – LocationClient未在“onConnected”方法中连接

android – LocationClient未在“onConnected”方法中连接,第1张

概述有人已经有这个问题: – 我正在初始化一个LocationClient,使用ConnectionCallbacks等等…… – 然后,我在上面调用“connect()”. – 在我的“onConnected”方法中,我调用myLocationClient.getLastLocation(),这会使应用程序在某些人设备上崩溃,但有异常: “Fatal Exception: java.lang.Ill 有人已经有这个问题:
– 我正在初始化一个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”方法中连接所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1130025.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存