ANDROID: Помощь с LocationProvider

Я пытаюсь получить свое местоположение для приложения, над которым я работаю. Однако я получаю сообщение об ошибке, а затем принудительно закрываю, когда он пытается выбрать лучшего поставщика. Любая помощь по этому вопросу будет очень признательна... мне нужно что-то объявить в onCreate, чтобы он работал? Вот фрагмент кода, за которым следует ошибка:

public void onStart(){
    super.onStart();
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    best = locationManager.getBestProvider(criteria, true);//Selects best location provider given options between GPS and poor man's
    locationProvider = locationManager.getProvider(best);

        if (locationProvider != null) {
            locationManager.requestLocationUpdates(locationProvider.getName(), 60000, 1,
                this.locationListenerRecenterMap);
        } else {
            Log.e(TAG, "NO LOCATION PROVIDER AVAILABLE");
            Toast.makeText(this, "The GPS location provider is not available at this time.", Toast.LENGTH_SHORT).show();
            finish();
        }

    GeoPoint location = this.getLastKnownPoint();
    this.mapController.animateTo(location);
}
public void onResume(){
    super.onResume();
    locationManager.requestLocationUpdates(best, 15000, 1, (LocationListener) this);
}
public void onPause(){
    locationManager.removeUpdates((LocationListener) this);
}
private GeoPoint getLastKnownPoint(){
    GeoPoint lastKnownPoint = GeoUpdateHelper.SCRANTON;
    Location lastKnownLocation = this.locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if(lastKnownLocation != null){
    lastKnownPoint = GeoUpdateHelper.getGeoPoint(lastKnownLocation);
    }else{
        lastKnownPoint = GeoUpdateHelper.SCRANTON;
    }
    return lastKnownPoint;
}

И вот ошибка:

04-16 19:07:25.077: ERROR/AndroidRuntime(4998): Caused by: java.lang.IllegalArgumentException: name==null
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):     at android.location.LocationManager.getProvider(LocationManager.java:324)
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):     at com.example.mapMain.onStart(mapMain.java:76)

РЕДАКТИРОВАТЬ: Это работает на моем OG Droid. Когда я нажимаю, чтобы открыть карту, часть приложения, которая получает местоположение, принудительно закрывается.


person IZI_Shadow_IZI    schedule 16.04.2011    source источник


Ответы (2)


Ошибка указывает на то, что лучший провайдер не найден, а вызов getBestProvider() вернул null.

Хотя вы на самом деле не указали никаких критериев, можно было бы ожидать, что этот вызов по крайней мере вернет «что-то». Javadocs немного расплывчаты и не упоминают, что этот метод может возвращать значение null. (смотря на исходный код, на самом деле он может возвращать null)

Однако возможно, что у вашего приложения/устройства нет доступных поставщиков. Можете ли вы выполнить следующий вызов, чтобы проверить, возвращает ли он каких-либо провайдеров (он вернет всех включенных провайдеров без учета каких-либо критериев)?

locationManager.getProviders(true) 

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

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
person ddewaele    schedule 16.04.2011
comment
У меня есть эти разрешения ... также грубое местоположение. Я просто не вижу, где что-то идет не так... - person IZI_Shadow_IZI; 17.04.2011
comment
Это на эмуляторе или на реальном устройстве? И включены ли поставщики на эмуляторе/устройстве? - person ddewaele; 17.04.2011
comment
Фу. У меня та же проблема, что и у оп. Одна вещь, которую я заметил в Google, заключается в том, что, кажется, существует предположение, что их дерьмо вернет null, если возникнет проблема, но я не уверен, что это поведение когда-либо проясняется. - person Joe Plante; 18.03.2013

В моем случае я тестировал устройство, на котором в настройках системы не были включены службы определения местоположения (службы определения местоположения Google, автономные службы GPS, службы определения местоположения VZW). Следовательно, requestLocationUpdates вызывал сбой приложения. Я окружил этот код блоком try/catch, и приложение больше не зависало.

person IgorGanapolsky    schedule 30.04.2013
comment
Ах, извините, что вы имеете в виду, окружив его блоком захвата? Надеюсь, вы не поймали исключение IllegalArgumentException... Несмотря на то, что это плохой стиль, вы можете избежать его, проверив, что вы указали NULL. Это также сэкономит вам производительность, поэтому java обрабатывает простую проверку намного эффективнее, чем переход в блок catch. - person Chris; 20.06.2013
comment
Я слышал, что вы говорите о стиле кода. Но эффективность работы в этой ситуации незначительна. - person IgorGanapolsky; 20.06.2013
comment
Я полностью согласен с вами в том, что в некоторых ситуациях производительность имеет наибольшее значение, но обработка исключений стоит дорого, поэтому, если вы можете, попытаться проверить параметры, чтобы избежать исключения, быстрее, чем получить исключение. Более точное обсуждение было на stackoverflow.com/questions/ 299068/how-slow-are-java-exceptions Для IAE: Может быть, это может вам помочь? stackoverflow.com/questions/9990129/ - person Chris; 26.06.2013
comment
@ Крис Спасибо за информацию. Если вы посмотрите на исходный код Android для приложения «Камера» здесь: androidxref.com/4.2.2_r1/xref/packages/apps/Camera/src/com/ Вы увидите, как они используют операторы try/catch для requestLocationUpdates. - person IgorGanapolsky; 27.06.2013
comment
Ну ладно, я снимаю карту производительности, здесь, кажется, действительно для надежности нужно ловить исключения во время настройки слушателей. API requestLocationUpdates говорит: Выбрасывает исключение IllegalArgumentException, если критерий имеет значение null IllegalArgumentException, если слушатель имеет значение null SecurityException, если нет подходящего разрешения. Таким образом, несмотря на проверку разрешений, довольно просто обойти предложение catch, если вы проверяете значения NULL, но если метод выдает это исключение, его можно поймать. - person Chris; 28.06.2013