我有一个使用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)
答案 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)
}
}
}