Сбой при вызове метода определения местоположения на некоторых устройствах - PullRequest
1 голос
/ 31 марта 2012

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

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

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

        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)

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

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

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

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

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

$adb shell dumpsys location

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

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

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

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

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

1 голос
/ 23 января 2013

или попробуйте

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)
        }
    }
}
1 голос
/ 31 марта 2012

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

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

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

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