Android: получите текущее местоположение от наилучшего имеющегося поставщика

У меня есть некоторый код Android, который должен получить наилучшее имеющееся местоположение БЫСТРО, от GPS, сети или независимо от того, что доступно. Точность менее важна, чем скорость.

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

Но мое приложение должно работать немного больше как приложение Карт, делает, когда оно сначала располагается, Вы - работаете от любого доступного поставщика и просто проверяете, что местоположение не дико устарело или является пустым.

Я попытался прокрутить свой собственный код, чтобы сделать это, но имею проблемы. (Это в IntentService, где загрузка происходит, если это имеет какое-либо значение. Я включал весь код для получения информации), Что случилось с этим кодом?

@Override
protected void onHandleIntent(Intent arg0) {
    testProviders();
    doUpload();
}
private boolean doUpload() {
       int j = 0;
       // check if we have accurate location data yet - wait up to 30 seconds
       while (j < 30) {
           if ((latString == "") || (lonString == "")) {
               Log.d(LOG_TAG, "latlng null");
               Thread.sleep(1000);
               j++;
       } else {
                Log.d(LOG_TAG, "found lat " + latString + " and lon " + lonString);
            break;
       }
       //do the upload here anyway, with or without location data
       //[code removed for brevity]
}
public boolean testProviders() {
    Log.e(LOG_TAG, "testProviders");
    String location_context = Context.LOCATION_SERVICE;
    locationmanager = (LocationManager) getSystemService(location_context);
    List<String> providers = locationmanager.getProviders(true);
    for (String provider : providers) {
        Log.e(LOG_TAG, "registering provider " + provider);
        listener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // keep checking the location - until we have
                // what we need
                //if (!checkLoc(location)) {
                Log.e(LOG_TAG, "onLocationChanged");
                locationDetermined = checkLoc(location);
                //}
            }
            public void onProviderDisabled(String provider) {
            }
            public void onProviderEnabled(String provider) {
            }
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }
        };
        locationmanager.requestLocationUpdates(provider, 0,
                0, listener);
    }
    Log.e(LOG_TAG, "getting updates");
    return true;
}
private boolean checkLoc(Location location) {
    float tempAccuracy = location.getAccuracy();
    int locAccuracy = (int) tempAccuracy;
    Log.d(LOG_TAG, "locAccuracy = " + locAccuracy);
    if ((locAccuracy != 0) && (locAccuracy < LOCATION_ACCURACY)) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        latString = latitude.toString();
        lonString = longitude.toString();
        return true;
    }
    return false;
}
public void removeListeners() {
    // Log.e(LOG_TAG, "removeListeners");
    if ((locationmanager != null) && (listener != null)) {
        locationmanager.removeUpdates(listener);
    }
    locationmanager = null;
    // Log.d(LOG_TAG, "Removed " + listener.toString());
}
@Override
public void onDestroy() {
    super.onDestroy();
    removeListeners();
}

К сожалению, это находит поставщика сетевых услуг, но только когда-либо выводы latlng null 30 раз - это никогда, кажется, не получает местоположение вообще. Я даже не получаю оператор журнала locationChanged.

Это забавно, потому что от ddms я вижу вывод как:

NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0

представляясь предполагать, что поставщик сетевых услуг действительно имеет некоторую информацию о местоположении, в конце концов, я просто не достигаю его.

Кто-либо может помочь? Я думаю, что рабочий пример кода был бы полезным ресурсом для сообщества Android/StackOverflow.

19
задан AP257 23 March 2010 в 23:39
поделиться

1 ответ

Thread.sleep () в производственном коде - это серьезный запах кода IMHO . Если вы обнаружите, что вам нужно это сделать, вы, вероятно, делаете что-то, что не должно работать таким образом. В этом случае я думаю, что это источник вашей проблемы - вы не позволяете Android вернуться к процессу. это очередь сообщений потока для отправки любых найденных им обновлений местоположения. Я подозреваю, что IntentService просто не подойдет для вашего сценария.

5
ответ дан 30 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: