位置方法调用在某些设备上崩溃
我有一个应用程序,使用MapView
,我打印出用户的纬度,经度和水平精度的一些标签。这一切都适用于我的HTC Wildfire,但在我的SE Xperia上,只要我尝试触摸Location.getLatitude()
,Location.getLongitude()
或Location.getAccuracy()
,应用程序就会崩溃。位置方法调用在某些设备上崩溃
我有一种预感,它可能是Xperia上的GPS速度太慢了,当我轮询拉特,长度和准确度时,位置管理器还没有获得它的坐标 - 但是我怎么能保护这个?
这里的片段:
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)
这是因为LocationManager.getLastKnownLocation()可以返回null。
在您的代码中,您要求GPS提供商更新您的设备位置。 但是当设备的GPS关闭时,该方法返回null。
如果还没有通过LocationManager处理任何请求,则LocationManager.getLastKnownLocation()也会返回空值。 因为LocationManager没有“Last Known Locations”值。
(你可以用下面的ADB命令检查的LocationManager的状态)
$adb shell dumpsys location
因此,如果你想与您的代码段获得成功,您的设备的GPS设置为ON,的LocationManager有一个“最后已知位置”
那么,我也使用LocationManager.getLastKnownLocation()方法,但略有不同。
我只是用LocationManager.getLastKnownLocation()方法检查是否有任何“Last Known Locations”值。因为这是解决当前位置价值的最快方法。 但是,如果它返回null,则通过requestLocationUpdates请求位置更新。
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null) {
// request location update!!
lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, listener);
}
还有一些技术解决设备的位置,我认为这将是一个巨大的答案。 相反,我会链接这个video这是关于位置的很好的解释。 (和其他更多的技巧!)
如果一直没有修复的话,那么该行
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
位置将是无效后。因此,你需要通过封闭需要与
if (location != null){
// your code
}
是的 - 我发现了这个问题后不久我发布的问题,并会自己回答它,但必须等待7个小时才能。尽管谢谢你的回答! – PinkFloydRocks 2012-04-11 11:14:06
位置或试试这个
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)
}
}
}
这是什么在logcat中打印时崩溃的代码与此应对? – 2012-03-31 08:14:54
@Alex我刚刚更新了Q与logcat输出 - NullPointerException它似乎 – PinkFloydRocks 2012-03-31 08:16:53