Получение более точного местоположения - PullRequest
0 голосов
/ 26 февраля 2020

В моем приложении Android я нацеливаюсь на устройство в диапазоне от

Минимум Android Версия - 7.1 (API 25)

Цель Android Версия - 10.0 (API 29)

Я использую приведенные ниже логи c, чтобы получить информацию о местоположении

Разрешения с использованием

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Код Logi c

 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

    try {
        gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
         network_loc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (gps_loc != null) {
            final_loc = gps_loc;
            latitude = final_loc.getLatitude();
            longitude = final_loc.getLongitude();
        }
        else if (network_loc != null) {
            final_loc = network_loc;
            latitude = final_loc.getLatitude();
            longitude = final_loc.getLongitude();
        }
        else {
            latitude = 0.0;
            longitude = 0.0;
        }
    }

Но большую часть времени я не могу получить точное местоположение с помощью вызова API. Но если включить опцию ниже на уровне устройства (в телефоне), я получу наиболее точное местоположение

enter image description here

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

Мне интересно, как я могу добиться того же с помощью кода. Кто-нибудь, пожалуйста, помогите.

1 Ответ

0 голосов
/ 26 февраля 2020

Что-то, что вы должны знать о getLastKnownLocation(...) [From Document]

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

Это никогда не активирует датчики для вычисления нового местоположения и всегда будет возвращать только кэшированное местоположение.


Пожалуйста, попробуйте locationManager.requestSingleUpdate(...), этот метод запросит текущее местоположение пользователя.

if(locationManager.allProviders.contains(LocationManager.GPS_PROVIDER)) {
    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, locListener)
} else if(locationManager.allProviders.contains(LocationManager.NETWORK_PROVIDER)){
    locationManager.rerequestSingleUpdate(LocationManager.NETWORK_PROVIDER, locListener)
}

А это слушатель.

val locListener = object: LocationListener {
        override fun onLocationChanged(location: Location?) {
            // do something with updated location here.
        }

        override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

        override fun onProviderEnabled(provider: String?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

        override fun onProviderDisabled(provider: String?) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

    }
...