java:android应用程序在能够';t立即找到/连接到GPS/位置
首先,如果我没有说清楚,我想道歉,因为英语不是我的第一语言+这实际上是我正在编写的第一个android应用程序,所以我也不知道它的术语/名称 我遇到的问题是,当我的GPS和/或网络连接不好时,我的应用程序一旦无法获得整个程序运行所需的当前位置就会崩溃(可能会因为无法连接到谷歌服务而崩溃?)。我不知道发生这种情况的具体原因,因为我目前没有坏的连接,这意味着我调试程序并检查它崩溃的确切原因,但我将尝试根据需要包括尽可能多的使用位置的方法 首先,我初始化变量:java:android应用程序在能够';t立即找到/连接到GPS/位置,java,android,gps,Java,Android,Gps,首先,如果我没有说清楚,我想道歉,因为英语不是我的第一语言+这实际上是我正在编写的第一个android应用程序,所以我也不知道它的术语/名称 我遇到的问题是,当我的GPS和/或网络连接不好时,我的应用程序一旦无法获得整个程序运行所需的当前位置就会崩溃(可能会因为无法连接到谷歌服务而崩溃?)。我不知道发生这种情况的具体原因,因为我目前没有坏的连接,这意味着我调试程序并检查它崩溃的确切原因,但我将尝试根据需要包括尽可能多的使用位置的方法 首先,我初始化变量: private LocationRequ
private LocationRequest mLocationRequest;
在onCreate()中,我创建以下对象:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setSmallestDisplacement(1)
.setInterval(2 * 1000)
.setFastestInterval(1000);
然后稍后我将覆盖onConnected():
onConnectionFailed():
下面是函数handleNewLocation(),它使用以下位置:
private void handleNewLocation(Location location) {
Log.d(TAG, location.toString());
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
这来自崩溃日志:
05-24 14:08:10.312 22251 22251 E AndroidRuntime: FATAL EXCEPTION: main
05-24 14:08:10.312 22251 22251 E AndroidRuntime: Process: xx.xx.xx.checkpoints, PID: 22251
05-24 14:08:10.312 22251 22251 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.location.Location.toString()' on a null object reference
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at xx.xx.xx.checkpoints.MapsActivity.handleNewLocation(MapsActivity.java:400)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at xx.xx.xx.checkpoints.MapsActivity.onConnected(MapsActivity.java:364)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzj.zzg(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.api.zze.zzmH(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.api.zze.onConnected(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.api.zzg$2.onConnected(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzi$zzg.zznO(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzi$zza.zzc(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzi$zza.zzr(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzi$zzc.zznQ(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.google.android.gms.common.internal.zzi$zzb.handleMessage(Unknown Source)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6724)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
05-24 14:08:10.312 22251 22251 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
我应该做些什么来改进这一点?比如说,怎样才能解决撞车的问题?如何检查位置是否已设置,如果未设置,请等到找到位置后再继续程序?为了澄清,我使用的是Maps v1。我想您必须检查一下这个方法是否正确 LocationServices.FusedLocationApi.getLastLocation(mgoogleapClient); 返回null, 我建议您在从中获取数据之前检查位置变量
private void handleNewLocation(Location location) {
if(location ==null)
return;
Log.d(TAG, location.toString());
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
希望这能奏效
编辑:
融合位置提供程序仅在至少有一个客户端连接到它时才维护后台位置。现在,仅仅打开定位服务并不能保证存储最后一个已知的位置
请参阅:首先,您需要检查位置是否为空,然后提取纬度和经度;如果位置为空,则需要请求位置更新
protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);}
一旦位置可用,就会调用回调方法
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
updateUI();
}
查看官方android以了解更多信息您尚未连接GoogleAppClient。将此复制粘贴到您的活动中
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
希望这有帮助。快乐编码摆弄了一会儿,似乎这就是解决方案,即使应用程序没有立即连接到服务/GPS/网络等,它也会检查“location”变量是否为空,如果为空,它会尝试以与以前相同的方式获取位置信息,直到获得为止
public void onConnected(Bundle bundle) {
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
while(location == null) {
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
handleNewLocation(location);
}
stacktrace在哪里???@subash对不起,我误解了。“我不知道为什么会发生这种情况,因为我目前没有坏的连接,这意味着我调试了程序,并检查了它崩溃的确切原因”然后上帝才知道,为什么它会崩溃。。只是Kidding@subashadded crashlogI将试用它,但我不认为是这样,因为如果我的连接正常(通过4G/GPS),应用程序就会工作,当我的连接不好时,它就会崩溃,并且不会立即获取位置。
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
public void onConnected(Bundle bundle) {
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
while(location == null) {
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
handleNewLocation(location);
}