Запустите Gps Tracking снова, когда приложение для Android On-Resumes () - PullRequest
0 голосов
/ 22 января 2019

Я создал систему, которая основана на динамическом отслеживании текущего местоположения пользователей при их перемещении по местам. Система работает отлично и обновляет текущее местоположение пользователей время от времени в базе данных Firebase. однако, когда приложение свернуто и снова возобновлено для того же действия, которое, конечно, является картой, оно только показывает местоположение пользователя, но не обновляет его в базе данных пожарной базы. теперь я знаю, что действие начинается снова с метода OnResume (), я пробовал несколько вещей, но каждый раз, когда я пытаюсь что-то сделать, большую часть времени говорит, что googleapiClient не подключен, а затем сразу падает. без манипулирования onResume, приложение работает отлично, но это не обновляет положение пользователя в базе огня, когда приложение свернуто и открыто из метода onResume. Что я должен сделать с методом onResume (), чтобы он начал посылать динамическое местоположение пользователя в firebase ??? Ниже я разместил свой код. Любая помощь будет оценена Спасибо.

public class RequestLocationMap extends FragmentActivity implements OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks
    , GoogleApiClient.OnConnectionFailedListener
    , LocationListener {

private static final String TAG = "RequestLocationMap";

private GoogleMap mMap;
private GoogleApiClient googleApiClient;
private LocationRequest locationRequest;
private Location lastLocation;
private Marker currentUserLocationMarker;
public static final int Request_User_Location_Code = 99;

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

    Log.d(TAG, "onCreate: called");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkUserLocationPermission();
    }


    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}


@Override
public void onMapReady(GoogleMap googleMap) {
    Log.d(TAG, "onMapReady: called");

    mMap = googleMap;


    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

        buildGoogleApiClient();
        mMap.setMyLocationEnabled(true);

    }
}

public boolean checkUserLocationPermission() {

    Log.d(TAG, "checkUserLocationPermission: called");

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);
        } else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Request_User_Location_Code);

        }
        return false;

    } else {
        return true;
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    Log.d(TAG, "onRequestPermissionsResult: here");

    switch (requestCode) {
        case Request_User_Location_Code:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    if (googleApiClient == null) {
                        buildGoogleApiClient();
                    }
                    mMap.setMyLocationEnabled(true);
                }
            } else {
                Toast.makeText(this, "Application requires location permission", Toast.LENGTH_SHORT).show();
            }
    }

}

protected synchronized void buildGoogleApiClient() {

    Log.d(TAG, "buildGoogleApiClient: called");

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

    googleApiClient.connect();
}

@Override
public void onConnected(@Nullable Bundle bundle) {

    Log.d(TAG, "onConnected: called");

    locationRequest = new LocationRequest();
    locationRequest.setInterval(1000);
    locationRequest.setFastestInterval(1000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);


    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:

                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                    try {

                        status.startResolutionForResult(
                                RequestLocationMap.this, 1000);
                    } catch (IntentSender.SendIntentException e) {

                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

                    break;
            }
        }
    });


    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);

    }


}
  @Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
public void onLocationChanged(Location location) {

    Log.d(TAG, "onLocationChanged: called");

    lastLocation = location;

    if (currentUserLocationMarker != null) {
        currentUserLocationMarker.remove();
    }

    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latLng);
    markerOptions.title("Current Location");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));

    currentUserLocationMarker = mMap.addMarker(markerOptions);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(14f));

    DatabaseReference myTracking = FirebaseDatabase.getInstance().getReference().child("MyTracking");
    GeoFire geoFire = new GeoFire(myTracking);
    geoFire.setLocation(FirebaseAuth.getInstance().getCurrentUser().getUid(), new GeoLocation(location
            .getLatitude(), location.getLongitude()));


}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    Log.d(TAG, "onActivityResult: called");

    switch (requestCode) {
        case 1000:
            switch (resultCode) {
                case Activity.RESULT_OK: {

                    break;
                }
                case Activity.RESULT_CANCELED: {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(RequestLocationMap.this, "App required location permission", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                }
                default: {
                    break;
                }
            }
            break;
    }


}

@Override
protected void onStop() {

    Log.d(TAG, "onStop: called");

    super.onStop();
    LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
    DatabaseReference myTracking = FirebaseDatabase.getInstance().getReference().child("MyTracking");
    GeoFire geoFire = new GeoFire(myTracking);
    geoFire.removeLocation(FirebaseAuth.getInstance().getCurrentUser().getUid());

}

@Override
protected void onResume() {

    Log.d(TAG, "onResume: called");

    super.onResume(); 



}
  }

1 Ответ

0 голосов
/ 22 января 2019

Проблема с вашим приложением состоит в том, что в методе жизненного цикла onStop () вы запрашиваете прекращение получения обновлений местоположения из API-интерфейса FusedLocation, но в ответном методе onResume (), Вы никогда не запрашиваете обновления местоположения. Более того, благодаря тому, как ваш код структурирован, даже если вы зарегистрировались для получения обновлений местоположения внутри onResume (), вы столкнетесь с проблемой с API GoogleClient, потому что он может (скорее всего, не) связан с время onResume () выполняется.

Я рекомендую вам вызвать метод buildGoogleApiClient () из onResume вместо onCreate () (по-прежнему выполнять проверку разрешений). Таким образом, API GoogleClient всегда подключен, пока действие возобновляется. Не забудьте вызвать «отключение» в GoogleClient API внутри onPause (). Внутри метода обратного вызова слушателя местоположения вы должны выполнить нулевую проверку ссылки GoogleMap, чтобы предотвратить любые NP-исключения. GoogleMaps могут иметь значение null во время первых нескольких выполнений onLocationChanged (Location) , поскольку для инициализации MapFragment может потребоваться больше времени, чем для получения первого обновления местоположения от API-интерфейса FusedLocation. Я видел, как API определения местоположения доставлял обновления местоположения в миллисекундах после того, как я запросил обновления.

Также, просто хорошая практика, вы должны связывать методы жизненного цикла с их взаимными ответами:

  1. onCreate () -> onDestroy ()
  2. onStart () -> onStop ()
  3. onResume -> onPause ()

Смешивание и сопоставление обратных вызовов жизненного цикла может укусить вас за линию, когда вы ожидаете отношения «до того, как произойдет», например, регистрация и отмена регистрации обновлений местоположения, когда приложение приостановлено и возобновлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...