位置方法调用某些设备上的崩溃

时间:2012-03-31 08:07:48

标签: android crash locationmanager

我有一个使用MapView的应用,我将用户的纬度,经度和水平精度打印到某些标签上。这一切都适用于我的HTC Wildfire,但在我的SE Xperia上,只要我尝试触摸Location.getLatitude()Location.getLongitude()Location.getAccuracy(),该应用就会崩溃。

我有一种预感,可能是Xperia上的GPS速度太慢,位置管理器在我查询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 OUTPUT:

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 个答案:

答案 0 :(得分:3)

那是因为LocationManager.getLastKnownLocation()可以返回null。

在您的代码中,您请求GPS提供商更新您的deivce的位置。 但是当设备的GPS关闭时,该方法返回null。

如果尚未通过LocationManager处理任何请求,LocationManager.getLastKnownLocation()也会返回空值。 因为LocationManager没有“最近一次的位置”值。

(您可以使用以下adb命令检查LocationManager的状态)

$adb shell dumpsys location

因此,如果您希望使用代码段取得成功,则设备的GPS处于启用状态且LocationManager具有“最后已知的位置”

嗯,我也使用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 :(得分:1)

如果它根本没有修复,那么在行

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

位置将为空。因此,您需要通过封装需要

位置的代码来解决这个问题
if (location != null){
    // your code
}

答案 2 :(得分: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)
        }
    }
}