2012-03-31 6 views
1

У меня есть приложение, которое использует MapView, и я печатаю широту, долготу и горизонтальную точность пользователя для некоторых ярлыков. Все это отлично работает на моем HTC Wildfire, но на моем SE Xperia приложение падает каждый раз, когда я пытаюсь коснуться Location.getLatitude(), Location.getLongitude() или Location.getAccuracy().Метод определения местоположения Вызывает сбои на некоторых устройствах

У меня есть догадка, что GPS-приемник Xperia может быть настолько медленным, что менеджер местоположения не получил координаты, когда я набираю lat, долго и точно, но как я могу защитить от этого ?

Вот фрагмент кода:

 mapView.setBuiltInZoomControls(false); 
     mc = mapView.getController(); 
     int maxLat = (int) (34.07687 * 1E6); 
     int maxLon = (int) (-118.438239 * 1E6); 
     int minLat = (int) (34.06489 * 1E6); 
     int minLon = (int) (-118.452358 * 1E6); 
     List <Overlay> overlays = mapView.getOverlays(); 

     MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mapView); 
     myLocationOverlay.enableMyLocation(); 
     overlays.add(myLocationOverlay); 

     mc.zoomToSpan(Math.abs(maxLat - minLat), Math.abs(maxLon - minLon)); 

     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
     Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 



     GeoPoint gp = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); 

LogCat ВЫВОД:

01-09 13:32:04.086: W/dalvikvm(1794): threadid=1: thread exiting with uncaught exception (group=0x2aac8560) 
01-09 13:32:04.086: E/AndroidRuntime(1794): FATAL EXCEPTION: main 
01-09 13:32:04.086: E/AndroidRuntime(1794): java.lang.NullPointerException 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at no.tibeapp.sno.UlovligeGarnActivity$1.run(UlovligeGarnActivity.java:180) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at android.os.Handler.handleCallback(Handler.java:587) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at android.os.Looper.loop(Looper.java:123) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at android.app.ActivityThread.main(ActivityThread.java:3701) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at java.lang.reflect.Method.invoke(Method.java:507) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
01-09 13:32:04.086: E/AndroidRuntime(1794):  at dalvik.system.NativeStart.main(Native Method) 
+0

Что печататься в LogCat при аварии? –

+0

@Alex Я только что обновил Q с выходом logcat - NullPointerException кажется – PinkFloydRocks

ответ

3

Это потому, что LocationManager.getLastKnownLocation() может возвращать нуль.

В вашем коде вы запросили провайдера GPS, чтобы обновить местоположение вашего девайса. Но когда GPS устройства отключено, этот метод возвращает null.

И если какие-либо запросы не были обработаны через LocationManager, LocationManager.getLastKnownLocation() также возвращают нулевое значение. Поскольку LocationManager не имеет значения «Последние известные местоположения».

(Вы можете проверить состояние LocationManager с следующим ADB команды)

$adb shell dumpsys location 

Поэтому, если вы хотите добиться успеха с помощью фрагмента кода, GPS вашего устройства включен и LocationManager имеет «Last Known Locations»

Ну, я использую метод LocationManager.getLastKnownLocation(), но немного другой.

Я просто проверяю, есть ли значение «Последние известные местоположения» с помощью метода LocationManager.getLastKnownLocation(). Потому что это самый быстрый способ разрешить текущее значение местоположения. Однако, если он возвращает значение null, запросите обновление местоположения через requestLocationUpdates.

Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
if (location == null) { 
    // request location update!! 
    lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, listener); 
} 

Существует также некоторое местоположение устройства для решения технических проблем, я думаю, что это будет огромный ответ. Вместо этого, я свяжу это video, что является прекрасным объяснением относительно местоположения. (и другие дополнительные советы !!)

1

Если у него не было затруднительное вообще, то после строки

Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

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

if (location != null){ 
    // your code 
} 
+0

Да, я узнал об этом вскоре после того, как я разместил вопрос и собирался ответить на него сам, но должен был ждать 7 часов, прежде чем смог. Спасибо за ответ, хотя! – PinkFloydRocks

1

или попробовать это

private class JavaScriptInterface { // use in javascript 
    public double getLatitude() { 
     try{ 
      return mostRecentLocation.getLatitude(); 
     }catch(Exception e){ //some devive without last location 
      return 25.046254;//default set Taipei Train Station (City Land Mark) 
     } 
    } 
    public double getLongitude() { 
     try{ 
      return mostRecentLocation.getLongitude(); 
     }catch(Exception e){ //some devive without last location 
      return 121.51752;//default set Taipei Train Station (City Land Mark) 
     } 
    } 
} 
Смежные вопросы