第一次启动应用时,Google位置服务getLastLocation将变为null

时间:2017-02-20 14:45:35

标签: android google-play-services google-location-services

所以我想显示我的位置的纬度和经度,但只有当我再次启动应用程序时它才显示我。 当我安装应用程序并首次启动它时,没有收到任何位置。 第一次获取当前位置的简单方法是什么?我做错了什么?我使用API​​ 24在模拟器上运行它。

这是我的代码:

private final static String LOG_TAG = MainActivity.class.getName();
private GoogleApiClient googleApiClient;
private Location lastLocation;
private LocationRequest locationRequest;
private TextView locationLatitude;
private TextView locationLongitude;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationLatitude = (TextView) findViewById(R.id.latitude_text);
    locationLongitude = (TextView) findViewById(R.id.longitude_text);

    buildGoogleApiClient();
}

@Override
protected void onStart() {
    super.onStart();
    googleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    googleApiClient.disconnect();
}

private void buildGoogleApiClient() {
    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.d(LOG_TAG, "onConnected");
    locationRequest = LocationRequest.create();
    locationRequest.setInterval(1000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    if(Build.VERSION.SDK_INT < 21){
        lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    }
    else {
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        }
        else{
            lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        }
    }


    if(lastLocation != null){
        locationLatitude.setText(String.valueOf(lastLocation.getLatitude()));
        locationLongitude.setText(String.valueOf(lastLocation.getLongitude()));
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 1){
        if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            }
        }
    }
}

@Override
public void onConnectionSuspended(int i) {
    Log.d(LOG_TAG, "onConnectionSuspended");
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.d(LOG_TAG, "onConnectionFailed");
}

@Override
public void onLocationChanged(Location location) {
    Log.d(LOG_TAG, "onLocationChanged");
    locationLatitude.setText(String.valueOf(location.getLatitude()));
    locationLongitude.setText(String.valueOf(location.getLongitude()));
}

1 个答案:

答案 0 :(得分:0)

您永远不会要求更新位置信息。

试试这个:

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.d(LOG_TAG, "onConnected");
    locationRequest = LocationRequest.create();
    locationRequest.setInterval(1000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(
            googleApiClient, locationRequest, this);


    if(Build.VERSION.SDK_INT < 21){
        lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    }
    else {
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        }
        else{
            lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        }
    }


    if(lastLocation != null){
        locationLatitude.setText(String.valueOf(lastLocation.getLatitude()));
        locationLongitude.setText(String.valueOf(lastLocation.getLongitude()));
    }
}