Как возобновить службы LocationServices для запроса обновлений местоположения в методе onResume

Мое приложение использует Google Maps Api для отображения текущего местоположения пользователя и, похоже, работает нормально, за исключением двух проблем:

1 Местоположение пользователя не обновляется в режиме реального времени, пока приложение не будет перезапущено.

2 Я не знаю, как возобновить LocationServices.FusedLocationApi в методе onResume, поэтому, как только пользователь покидает приложение, GPS не перезапускается.

Я попытался следовать большинству предложений, найденных в учебниках и аналогичных вопросах на этом сайте (например, a-service">Где я должен запрашивать обновления местоположения в службе A?), но пока ничего не помогло в моем случае.

Вот мой код:

public class MainActivity extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener
{

private static final int ERROR_DIALOG_REQUEST = 9001;
GoogleMap mMap;

private GoogleApiClient mLocationClient;
private LocationListener mListener;
private View view;

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

    if (servicesOK()) { // If map is available, load it.
        setContentView(R.layout.activity_map);

        if (initMap()){
            mLocationClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            mLocationClient.connect();

        } else {
            Toast.makeText(this, "Map not connected!", Toast.LENGTH_SHORT).show();
        }
    } else {
        setContentView(R.layout.activity_main);
    }
}

public boolean servicesOK (){
    // Checks if GooglePlayServices (Google Map) connection is established
    int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    if (isAvailable == ConnectionResult.SUCCESS) {
        return true;
    } else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)) {
        Dialog dialog =
                GooglePlayServicesUtil.getErrorDialog(isAvailable, this, ERROR_DIALOG_REQUEST);
        dialog.show();
    } else {
        Toast.makeText(this, "Mapping unsuccessful!", Toast.LENGTH_SHORT).show();
    }
    return false;
}

private boolean initMap() {
    if (mMap == null) {
        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mMap = mapFragment.getMap();
    }
    return (mMap != null);
}

private void gotoLocation(double lat, double lng) {
    LatLng latLng = new LatLng(lat, lng);
}

public void showCurrentLocation(MenuItem item) {
    Location currentLocation = LocationServices.FusedLocationApi
            .getLastLocation(mLocationClient);

    if (currentLocation == null) {
        Toast.makeText(this, "Couldn't connect to map!", Toast.LENGTH_SHORT).show();
        Log.d("Hello", "Couldn't connect to map" + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!********************************");

    } else {
        LatLng latLng = new LatLng(
                currentLocation.getLatitude(),
                currentLocation.getLongitude()
        );
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
                latLng, 15
        );
        mMap.animateCamera(update);
    }
}

@Override
public void onConnected(Bundle connectionHint) {
    // Executed when connection is successful
    Toast.makeText(this, "Map ready!", Toast.LENGTH_SHORT).show();

    Location currentLocation = LocationServices.FusedLocationApi
            .getLastLocation(mLocationClient);

    LatLng latLng1 = new LatLng(
            currentLocation.getLatitude(),
            currentLocation.getLongitude()
    );

    //Adds Marker when map is connected!
    MarkerOptions options = new MarkerOptions().position(latLng1).visible(true).title("Me!")              .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_VIOLET));
    mMap.addMarker(options);

    mListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Toast.makeText(MainActivity.this,
            "Location changed!", Toast.LENGTH_SHORT).show();
            gotoLocation(location.getLatitude(), location.getLongitude());
        }
    };

        // Requests user's current location
    LocationRequest request = LocationRequest.create();
    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    request.setInterval(10000); // TODO: 11/12/15 Change this to 90000 (90 secs)!!!!!!!!!!!!!
    request.setFastestInterval(3000); // TODO: 11/12/15 Change this to 60000 (60 secs)!!!!!!!!!
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mLocationClient, request, mListener
    );
}

@Override
protected void onPause() { // Stops location updates
    super.onPause();
    LocationServices.FusedLocationApi.removeLocationUpdates(
            mLocationClient, mListener
    );
    Log.d("Hello", "The map has been paused!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!********************************");
}

@Override
protected void onResume() { // Resumes location updates
    super.onResume();
    Log.d("Hello", "The map has been resumed!!!!!!!!!!!!!!!!!********************************");

//Moves camera to user's current location!
        LocationRequest request = LocationRequest.create();
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        Location currentLocation = LocationServices.FusedLocationApi
                .getLastLocation(mLocationClient);
        if (currentLocation == null) {
            Toast.makeText(this, "Couldn't connect to map!", Toast.LENGTH_SHORT).show();
        } else {
            LatLng latLng = new LatLng(
                    currentLocation.getLatitude(),
                    currentLocation.getLongitude()
            );
            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
                    latLng, 15
            );
            mMap.animateCamera(update);
        }
}

@Override
public void onConnectionSuspended(int i) {
    // Executed when connection is stopped
    Log.d("Hello", "The connection was suspended!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!********************************");
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// Executed when connection is unsuccessful
    Log.d("Hello", "The connection failed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!********************************");
}

}


person Emzor    schedule 18.11.2015    source источник
comment
Я отредактировал свой класс Activity, чтобы показать только соответствующий код по отношению к вопросу.   -  person Emzor    schedule 23.11.2015


Ответы (3)


Я думаю, вам следует позвонить еще раз

 LocationServices.FusedLocationApi.requestLocationUpdates(
        mLocationClient, request, mListener);

в методе onResume() и сделать запрос LocationRequest глобальным

person Melvin Mauricio    schedule 18.11.2015
comment
Спасибо @Melvin Mauricio, я сделал, как вы предложили, но приложение вылетает при запуске, и, как ни странно, в logcat не отображается никаких ошибок. Чтобы быть уверенным, сделать LocationRequest глобальным означает просто объявить LocationRequest request; в MainActivity? - person Emzor; 19.11.2015
comment
Сначала проверьте свой клиент API Google, если он подключается googleApiclient.isConnected(), и если это запрос, выполните метод - person Melvin Mauricio; 20.11.2015
comment
Пожалуйста, не могли бы вы разбить его для меня? Как именно мне это сделать? - person Emzor; 20.11.2015
comment
Мне нужен весь класс Activity - person Melvin Mauricio; 21.11.2015
comment
Я обновил свой вопрос, включив в него весь класс Activity. Мои извинения за столь поздний ответ. - person Emzor; 23.11.2015

Вы вообще не запускаете LocationUpdates в своей деятельности. Запустите его в onConnected(). См. здесь.

После того, как вы запустите обновления местоположения, в onResume() вам просто нужно проверить, что GoogleApiClient подключен, а также инициализирован requestingLocationUpdates, и вы запускаете locationUpdates. См. это.

PS: в вашем коде есть и другие несоответствия, вам, вероятно, следует прочитать все руководство один раз и точно понять методы.

person Kay_N    schedule 20.11.2015
comment
Я ценю ваш комментарий. Не могли бы вы указать на некоторые несоответствия. Я все еще новичок, и мне нужна вся помощь, которую я могу получить. - person Emzor; 23.11.2015

Наконец, я решил проблему, используя этот ответ.

Вместо onResume() (который не сработал после нескольких недель попыток) я использовал onRestart()

@Override
protected void onRestart(){
    super.onRestart();
    onConnected(Bundle.EMPTY);
}

И это сработало отлично!

person Emzor    schedule 23.12.2015