2017-02-20 16 views
0

Так что я хочу показать свою широту и долготу позиции, однако это показывает мне только после того, как я снова запустил приложение. Когда я устанавливаю приложение и запускаю его в первый раз, позиция не получена. Что такое простой способ получить текущее местоположение в первый раз? Что я делаю неправильно? Я бегу это на эмуляторе с API 24.Служба геолокации Google getLastLocation получает null при запуске приложения в первый раз

Вот мой код:

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())); 
} 
+0

Иногда последнее место не доступно, и будет нулевым. Подумайте о сохранении последнего места в предпочтении для этого сценария или о возврате к процессу, выполняемому при первом загрузке приложения. – danny117

ответ

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())); 
    } 
} 
+0

Я изменил свой метод onConnected на ваш, но теперь сбой приложений, и это исключение: java.lang.SecurityException: у клиента должно быть разрешение ACCESS_FINE_LOCATION для запроса адресов PRIORITY_HIGH_ACCURACY. ' Однако у меня есть это разрешение в моем манифесте. – Konrad

+0

Можете ли вы показать реализацию своих прав? –

+0

Я только что положил это 'LocationServices.FusedLocationApi.requestLocationUpdates ( googleApiClient, locationRequest, это);' там же, где я запрашиваю getLastLocation. Теперь нет никакого исключения, но все же у меня такая же проблема, как и в начале. Я только меняю свой метод onConnected, остальное походит на начало моего вопроса (я предоставил весь код) – Konrad