Blackberry - LocationProvider.getLocation() висит на
Я написал очень простое приложение, которое запрашивает у LocationProvider местоположение и распечатывает его в System.out. Это прекрасно работает в симуляторе. Однако, когда я запускаю его на своем устройстве BlackBerry, вызов getLocation, кажется, зависает бесконечно. Я запускаю код в отдельном потоке, который просто получает поставщика и запрашивает местоположение. Я попробовал это с нулевыми Критериями (которые должны дать мне правильные значения по умолчанию?), А также Критериями, которые должны предоставить Помощь, а затем Автономный Я включил свой код ниже. Когда я запускаю это на моем устройстве, оно зависает при вызове getLocation. Вот мой код ниже.. Пожалуйста, расскажите, что я могу делать не так...
public void getLocation() {
Thread t = new Thread(new Runnable() {
private double lat;
private double lon;
public void run() {
Criteria cr = new Criteria();
cr.setHorizontalAccuracy(Criteria.NO_REQUIREMENT);
cr.setVerticalAccuracy(Criteria.NO_REQUIREMENT);
cr.setCostAllowed(false);
cr.setPreferredPowerConsumption(Criteria.NO_REQUIREMENT);
cr.setPreferredResponseTime(1000);
LocationProvider lp = null;
try {
lp = LocationProvider.getInstance(cr);
} catch (LocationException e) {
// System.out.println("*****************Exception" + e);
}
Coordinates c = null;
if (lp == null) {
UiApplication.getUiApplication().invokeLater(
new Runnable() {
public void run() {
Dialog.alert("GPS not supported!");
return;
}
});
} else {
// System.out.println("OK");
switch (lp.getState()) {
case LocationProvider.AVAILABLE:
// System.out.println("Provider is AVAILABLE");
Location l = null;
try {
l = lp.getLocation(-1);
} catch (LocationException e) {
// System.out.println("***Location Exception caught "
// + e);
} catch (InterruptedException e) {
// System.out.println("***Interrupted Exception aught:"
// + e);
} catch (Exception e) {
// System.out.println("***Exception caught :"
// ;+ e);
}
if (l != null && l.isValid()) {
c = l.getQualifiedCoordinates();
}
if (c != null) {
lat = c.getLatitude();
lon = c.getLongitude();
System.out.println(lat + " - " + lon);
}
}
}
}
});
t.start();
}
2 ответа
Пробовать:
- проверьте, включен ли GPS на устройстве
- проверьте, есть ли у вашего устройства и оператора доступный используемый вами режим GPS ( здесь)
- если ваш оператор - Verizone, проверьте наличие подписи Verizon GPSSettings
- сбросить LocationProvider (описан в разделе " Лучшие практики для разработки GPS-приложений для смартфонов BlackBerry, работающих в сетях CDMA)
Говоря о висящих нитях,
locationProvider.getLocation(-1)
зависает, потому что если вы используете -1, тайм-аут не будет. Попробуй это:
int timeout = 120;
try {
location = provider.getLocation(timeout);
} catch (LocationException e) {
System.out.println("Location timeout");
} catch (InterruptedException e) {
System.out.println("InterruptedException"+e.getMessage());
}
Кроме того, если вы используете System.out.println(text)
в симуляторе, на устройстве было бы лучше
getApplication().invokeLater(new Runnable(){
public void run() {
screen.add(new LabelField(text));
}
});
или же
getApplication().invokeLater(new Runnable(){
public void run() {
Dialog.inform(text);
}
});
Время ожидания -1 должно быть в порядке, оно должно просто перейти к значению по умолчанию. Значение по умолчанию может быть высоким, хотя, если это не происходит в фоновом режиме, вы можете установить таймаут на 15 секунд.
Причина, по которой это работает в симуляторе, но зависает на реальном устройстве, заключается в том, что у вас нет GPS-устройства на устройстве, где вы проводите тестирование...
Я не шучу, ты пробовал это снаружи?