FusedLocationClient, возвращающий нулевые значения для нескольких пользователей - PullRequest
0 голосов
/ 02 июля 2018

В моем приложении для Android в настоящее время я использую API-интерфейс Fused Location Provider (см. Код ниже) для определения местоположения моих пользователей, и у меня есть несколько редких жалоб на то, что мое приложение не может найти свое собственное местоположение в приложении.

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

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

    if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) {
        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) {
                    return;
                }
                if(locationResult.getLastLocation() != null)
                    currentLocation = locationResult.getLastLocation();
            }
        };
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback,null);
        locationOn = true;
    }

После некоторого осмотра кажется, что он иногда будет возвращать нулевые значения в течение определенного периода времени (или навсегда), и мое приложение не будет работать. Другие приложения GPS работают так же хорошо (например, Google Maps).

Правильно ли реализована моя реализация или это что-то внешнее, такое как Google Play Services, переводится в режим экономии заряда батареи?

1 Ответ

0 голосов
/ 03 июля 2018

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

Попробуйте этот фрагмент из моего кода (при этом я никогда не получаю нулевое значение, где я хочу местоположение, поскольку оно по крайней мере вернет последнее местоположение или правильно покажет пользователю сообщение об ошибке и способ ее решения .:

private void updateLocations(){

 String str_latitude = "";

 String str_longitude = "";

 String provider = "";

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

        provider = LocationManager.GPS_PROVIDER;

    } else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {

        provider = LocationManager.NETWORK_PROVIDER;
    }

    if (!provider.equals("")) {

        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(MainActivity.this);

        @SuppressLint("MissingPermission") Task locationResult = mFusedLocationProviderClient.getLastLocation();

        locationResult.addOnCompleteListener(MainActivity.this, new OnCompleteListener() {

            @Override
            public void onComplete(@NonNull Task task) {
                if (task.isSuccessful()) {

                   Location mLastKnownLocation = (Location) task.getResult();

                    if (mLastKnownLocation != null) {

                        str_longitude = String.valueOf(mLastKnownLocation.getLatitude());

                        str_latitude = String.valueOf(mLastKnownLocation.getLongitude());

                        Toast.makeText(context, "Lat: "+str_latitude + ", Long " + str_longitude, Toast.LENGTH_LONG).show();
                    }

                    if (str_latitude.equals("") || str_longitude.equals("")) {

                        Snackbar.make(coordinatorLayout, "Couldn't find location, please try again in a moment", Snackbar.LENGTH_LONG).show();
                    }
                }
            }
        });


    } else if (provider.equals("")) {

        Snackbar snackbar = Snackbar.make(coordinatorLayout, "Seems like all providers of device are disabled", Snackbar.LENGTH_LONG);

        snackbar.setAction("Enable", new View.OnClickListener() {

            @Override
            public void onClick(View v) {
            //Takes user to gps enable settings.
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        });

        snackbar.show();
    }

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