Как обеспечить, чтобы мое географическое местоположение было реальным GPS, а не только пассивным местоположением конечной точки моей сети?

#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 — лучший выбор, поскольку он более доступен.