Как использовать getCurrentLocation клиента поставщика плавких местоположений?

Я новичок в кодировании Android и написал код для определения местоположения Android-устройства, но не смог. Ничего не изменилось (например, mLastKnownLocation или cityName) после запуска, и никаких исключений. Я уже проверил разрешение и build.gradle. Не могли бы вы дать мне советы по его реализации?

private void getDeviceLocation() {
        try {
            if (mLocationPermissionGranted) {

                Task<Location> locationResult = mFusedLocationProviderClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY,cancellationToken);
                //Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();

                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>(){
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            // Obtain the current location of the device
                            mLastKnownLocation = task.getResult();
                            String currentOrDefault = "Current";

                            if (mLastKnownLocation != null) {
                                Log.d(TAG, "Get current location");
                            } else {
                                Log.d(TAG, "Current location is null. Using defaults.");
                                currentOrDefault = "Default";

                                // Set current location to the default location
                                mLastKnownLocation = new Location("");
                                mLastKnownLocation.setLatitude(mDefaultLocation.latitude);
                                mLastKnownLocation.setLongitude(mDefaultLocation.longitude);
                            }

                            String city = "CorrectCity";
                            try {
                                List<Address> address =
                                        geocoder.getFromLocation(mLastKnownLocation.getLatitude(),
                                        mLastKnownLocation.getLongitude(), 1);
                                if (address.isEmpty())
                                    city = "No_city";
                                else{
                                Address target = address.get(0);

                                if (target.getLocality()!=null)
                                    city = target.getLocality();
                                else
                                    city = target.getAdminArea();}
                            } catch (IOException e) {
                                Log.e("Exception: %s", e.getMessage());
                            }

                            cityName = city;
                            // Show location details on the location TextView
                            String msg = currentOrDefault + " Location: " +
                                    Double.toString(mLastKnownLocation.getLatitude()) + ", " +
                                    Double.toString(mLastKnownLocation.getLongitude())+ "  " +
                                    cityName;
                            locationTextView.setText(msg);

                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            /*mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                            mMap.getUiSettings().setMyLocationButtonEnabled(false);*/
                        }
                    }
                });
            }
        } catch (SecurityException e)  {
            Log.e("Exception: %s", e.getMessage());
            cityName = "ErrorCity";
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить свое последнее известное местоположение, используя приведенный ниже код.

FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(getContext());
fusedLocationClient.getLastLocation().addOnSuccessListener(location -> {
    if (location != null) {
        // your last known location is stored in `location`
    }
});

обратитесь: https://developer.android.com/training/location/retrieve-current


Использование Location Manager

LocationManager manager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
    @Override
    public void onLocationChanged(@NonNull Location location) {
        mMap.clear();
        LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude());
        mMap.addMarker(new MarkerOptions().position(userLocation).title("Me"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15));
    }

    @Override
    public void onProviderEnabled(@NonNull String provider) {

    }

    @Override
    public void onProviderDisabled(@NonNull String provider) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }
};

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);

Уважаемый сэр, это не работает для меня. Он просто получает старые данные, потому что getCurrentLocation() пропускается по неизвестной причине.

sern 04.10.2022 12:52

Вы пытались изменить местоположение вашего устройства? И где я использовал getCurrentLocation?

Sidharth Mudgil 04.10.2022 12:55

В случае, если я использую эмулятор, я изменил местоположение с «Расширенное управление» -> «Местоположение» -> «Единая точка», но getLastLocation() не работает для этого изменения, в то время как перед изменением он получает старое местоположение. Как вы можете видеть строку под getCurrentLocation() в моем коде, я пробовал.

sern 04.10.2022 13:13

код внутри MapFragment?

Sidharth Mudgil 04.10.2022 13:34

Я просто хочу показать местоположение в текстовом виде, а не на карте. Должен ли я реализовать MapFragment в этом случае.

sern 04.10.2022 13:36

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

sern 04.10.2022 13:39

Я обновил ответ, попробуйте использовать диспетчер местоположений

Sidharth Mudgil 04.10.2022 13:50

@sern, если это ответ на ваш вопрос, вы можете принять этот ответ

Sidharth Mudgil 05.10.2022 19:20

Извините за поздний ответ! Я пробовал LocationManager, но все равно не работает. Однако я обнаружил, что мой код Task<Location> locationResult = mFusedLocationProviderClient.getCurrentLocation(Priority.PRI‌​ORITY_HIGH_ACCURACY, cancellationTokenSource.getToken()); успешно работает в другом проекте, но в этом проекте я могу применить только getLastLocation().

sern 09.10.2022 06:08

Поэтому я дважды проверил свои настройки (манифест, API и градиент), но до сих пор понятия не имею. Есть ли у вас какие-либо идеи по поводу этой ситуации. Если да, не могли бы вы сказать мне или опубликовать в своем ответе, я приму его немедленно.

sern 09.10.2022 06:08

Другие вопросы по теме