android - 用于查找当前位置不起作用的代码段

时间:2016-08-25 20:13:04

标签: android nullpointerexception locationmanager

我在Android应用程序中使用以下代码来查找我的移动设备的当前位置:

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Double longitude = location.getLongitude();
Double latitude = location.getLatitude();
Log.i("LATITUDE", latitude.toString());
Log.i("LONGITUTDE", longitude.toString());

到目前为止,它工作正常,它给了我正确的位置坐标。但是在一段时间之前并没有对我的代码进行任何更改,它开始给我以下错误:

  

java.lang.RuntimeException:无法启动活动ComponentInfo {di.uoa.gr.e_commerce / di.uoa.gr.e_commerce.FirstResultsActivity}:

     

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'double android.location.Location.getLongitude()'               在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2695)               在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)               在android.app.ActivityThread.access $ 900(ActivityThread.java:177)               在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1430)               在android.os.Handler.dispatchMessage(Handler.java:102)               在android.os.Looper.loop(Looper.java:135)               在android.app.ActivityThread.main(ActivityThread.java:5910)               at java.lang.reflect.Method.invoke(Native Method)               在java.lang.reflect.Method.invoke(Method.java:372)               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1405)               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

我确实打开了WiFi连接,以及我的位置。 任何人都可以找出可能出现的问题吗?

3 个答案:

答案 0 :(得分:2)

  

getLastKnownLocation
  [...]请注意,此位置可能已过期,例如,如果设备已关闭并移至其他位置。

     

developer.android.com

如果您需要多次使用该位置,则应该使用requestSingleUpdate方法或requestLocationUpdates方法之一。 Here是包含所述方法的所有签名的文档。

它看起来像这样:

lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null);

然后您将收到班级中的位置。但是你的类需要实现LocationListener。作为替代方案,您可以提供LocationListener作为参数。

这看起来像这样:

lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, new LocationListener() {
    @Override
    public void onLocationChanged(Location location)
    {

    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle)
    {

    }

    @Override
    public void onProviderEnabled(String s)
    {

    }

    @Override
    public void onProviderDisabled(String s)
    {

    }
    }, null);

然后在onLocationChanged中获取您的位置。

答案 1 :(得分:0)

首先,您应该检查您是否拥有获取当前位置的权限,如果您使用的是Android API 23+,则必须手动提出。

其次,LocationManager.getLastKnownLocation不一定返回有效的位置,因为它可能返回" null"没有位置对您选择的提供商(GPS_PROVIDER)足够一致。如果此处没有位置,您应该回退到另一个提供商,如果找不到,请尝试请求位置。

答案 2 :(得分:0)

lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

不一定返回位置,设备没有保存的GPS位置,因此该方法返回null;