#android #android-gps
#Android #android-gps
Вопрос:
У нас есть собственные планшеты, которые мы контролируем, и у нас есть требование, чтобы их записанное местоположение было максимально точным. Я делаю все, что должен, чтобы включить настоящий GNSS GPS, но getLastKnownLocation("gps")
всегда возвращается null
.
Мы используем Samsung Galaxy Tab A7, SM-T500, спецификации которого клянутся, что он имеет настоящий GPS GNSS радиоприемник. Карты Google правильно идентифицируют мое секретное логово.
Наши AndroidManifest.xml
запросы разрешений GPS:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<activity
android:name=".MainActivity"
android:foregroundServiceType="location"
...
>
В настройках планшета у нашего приложения есть разрешение на определение местоположения «Только во время использования приложения», и это нормально, потому что наше приложение доминирует на нашем планшете и является интерактивным. Наш планшет не используется в транспортном средстве, поэтому местоположение должно быть точным только в течение последних 10 минут или около того.
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
возвращает true
, как и этот вызов с PASSIVE_PROVIDER
помощью and NETWORK_PROVIDER
. Поставщик «fused» недоступен.
Затем мы вызываем это, чтобы извлекать все виды местоположений и возвращать наиболее точное:
private static Location getLastKnownLocation(@NonNull LocationManager locationManager) {
List<String> providers = locationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = locationManager.getLastKnownLocation(provider);
if (l == null)
continue;
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy())
bestLocation = l; // Found best last known location: %s", l);
}
return bestLocation;
}
Все, что мы получаем, это «пассивный». Требуются ли местоположения GPS для прохождения туда и обратно или достаточно хорошо? locationManager.requestLocationUpdates()
getLastKnownLocation()
Комментарии:
1. Ответом является requestLocationUpdates
2. да, я понял. мой onCreate() и так страдает ожирением…
Ответ №1:
Аналогичные ответы есть в других местах, но этот поток заслуживает закрытия. Кажется getLastKnownLocation()
, это не работает со спутниками GPS и GNSS, так как Phantom Lord подсказал, что правильное исправление — включить мою основную активность для GPS:
public class MainActivity extends AppCompatActivity implements LocationListener {
Затем, в onCreate()
свою очередь, на слушателе:
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return; // TODO spank user
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);
}
Затем следите за обновлениями:
private Location gpsLocation = null;
@Override
public void onLocationChanged(Location location) {
gpsLocation = location;
}
Теперь новый вопрос: почему точность определения местоположения ~ 5 метров, а точность определения местоположения GPS составляет ~ 14 метров? Это наивный планшет, поэтому он, конечно, не знает мой домашний адрес и тому подобное. Согласно моему интернет-спаму, мой IP-адрес находится в соседнем городе…
Комментарии:
1. Возможно, он триангулирует с помощью антенн и Wi-Fi. Однако gps — лучший выбор, поскольку он более доступен.