Расположение нулевое - Android - PullRequest
0 голосов
/ 04 ноября 2019

Я создаю приложение, в котором я хочу узнать свое текущее местоположение. Я хочу получить местоположение только один раз, когда пользователь открывает приложение. Мне не нужно никаких обновлений, пока приложение открыто. Вот мой код.

public class MainActivity extends AppCompatActivity {

private LocationRequest mLocationRequest;
private LocationCallback mLocationCallback;

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

    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
        return;
    }

    fetchLocation();
}


private void fetchLocation() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setInterval(600);
    mLocationRequest.setFastestInterval(300);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                Log.d("MyTag", "Location is null");
                return;
            }
            for (Location location : locationResult.getLocations()) {
                if (location != null) {
                    Log.d("MyTag", location.getLatitude() + " " + location.getLongitude());
                }
            }
        }
    };

    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    Log.d("MyTag", "GoogleAPIClient connected");

                    Task<Location> task = LocationServices.getFusedLocationProviderClient(MainActivity.this).getLastLocation();
                    task.addOnSuccessListener(MainActivity.this, new OnSuccessListener<Location>() {
                        @Override
                        public void onSuccess(Location location) {
                            if (location == null) {
                                LocationServices.getFusedLocationProviderClient(MainActivity.this).requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
                            } else {
                                Log.d("MyTag", "My location is: " + location.getLatitude() + " : " + location.getLongitude());
                            }
                        }
                    }).addOnFailureListener(MainActivity.this, new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.d("MyTag", "Error message: " + e.getMessage());
                        }
                    });
                }

                @Override
                public void onConnectionSuspended(int i) {
                    Log.d("MyTag", "GoogleAPIClient connection suspended");
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    if (connectionResult.hasResolution()) {
                        try {
                            // Start an Activity that tries to resolve the error
                            connectionResult.startResolutionForResult(MainActivity.this, 0);
                        } catch (IntentSender.SendIntentException e) {
                            e.printStackTrace();
                        }
                    }
                }
            })
            .addApi(LocationServices.API)
            .build();

    mGoogleApiClient.connect();

    LocationServices.getFusedLocationProviderClient(MainActivity.this).getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            if (location != null) {
                Log.d("MyTag", "My locations is: " + location.getLatitude() + " : " + location.getLongitude());
            } else {
                Log.d("MyTag", "My locations is null");
            }
        }
    });
}
}

Я просмотрел почти все ответы на вопросы stackoverflow, но ничего не помогло. Я не знаю, где я делаю неправильно. Я читал, что объединенный провайдер местоположения будет поддерживать фоновое местоположение, только если к нему подключен хотя бы один клиент. Я подключаюсь GoogleApiClient. Если вы видите логи, он успешно подключается, но тогда ничего не происходит. Спасибо.

Мои журналы:

-- My locations is null
-- GoogleAPIClient connected
...