java:android app崩溃时无法立即找到/连接到GPS /位置

时间:2017-05-24 10:51:05

标签: java android gps

首先,如果我不是很清楚,我会道歉,因为英语不是我的第一语言+这实际上是我写的第一个Android应用程序,所以我不知道事物的条款/名称。

我遇到的问题是,当我的GPS和/或网络连接不良时,我的应用程序会在无法获得整个程序运行所需的当前位置时崩溃(可能因为崩溃而崩溃)没有连接到谷歌服务?)。我不知道为什么会发生这种情况,因为我目前没有糟糕的连接,这意味着我调试程序并确切地检查它崩溃的原因,但我会尝试包含尽可能多的使用位置的方法

首先我初始化变量:

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():

@Override
public void onConnected(Bundle bundle) {
    Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    handleNewLocation(location);
}

onConnectionFailed():

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    if (connectionResult.hasResolution()) {
        try {
            connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
        } catch (IntentSender.SendIntentException e) {
            e.printStackTrace();
        }
    } else {
        Log.i(TAG, "Connection has failed, code: " + connectionResult.getErrorCode());
    }
}

这是使用location:

的函数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。

4 个答案:

答案 0 :(得分:0)

我想你必须检查一下这种方法 LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 返回null, 我建议您在从中获取数据之前检查位置变量。

private void handleNewLocation(Location location) {
    if(location ==null)
        return;
    Log.d(TAG, location.toString());
    double currentLatitude = location.getLatitude();
    double currentLongitude = location.getLongitude();

希望这有效

编辑: 融合的位置提供程序仅在至少有一个客户端连接到它时才会保留后台位置。现在只需打开位置服务,就无法保证存储最后一个已知位置。

请参阅:this answer

答案 1 :(得分:0)

首先,您需要检查位置是否为空,然后提取纬度和经度,如果位置为空,则需要请求位置更新。

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 link以获取更多信息

答案 2 :(得分:0)

您尚未连接GoogleApiclient。复制粘贴到您的活动中。

    @Override
protected void onStart() {
    mGoogleApiClient.connect();

    super.onStart();

}
protected void onStop() {
    mGoogleApiClient.disconnect();
    super.onStop();
}

希望这会有所帮助。快乐的编码

答案 3 :(得分:0)

摆弄了一段时间,似乎这是解决方案,即使应用程序没有立即连接到服务/ 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);
}