1

我从以下代码行中得到一个空指针异常:

    double longitude = location.getLongitude();

我在弄清楚问题所在时遇到了问题。

    LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, waypointActivity);

    //LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    double longitude = location.getLongitude();
    double latitude = location.getLatitude();
    String locLat = String.valueOf(latitude)+","+String.valueOf(longitude);

这是 logcat 输出:

04-30 10:20:54.988: E/AndroidRuntime(1827): FATAL EXCEPTION: main
04-30 10:20:54.988: E/AndroidRuntime(1827): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.LoadedApk.makeApplication(LoadedApk.java:504)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4364)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.os.Looper.loop(Looper.java:137)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at java.lang.reflect.Method.invoke(Method.java:511)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at dalvik.system.NativeStart.main(Native Method)
04-30 10:20:54.988: E/AndroidRuntime(1827): Caused by: java.lang.NullPointerException
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:379)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.LoadedApk.getClassLoader(LoadedApk.java:322)
04-30 10:20:54.988: E/AndroidRuntime(1827):     at android.app.LoadedApk.makeApplication(LoadedApk.java:496)
04-30 10:20:54.988: E/AndroidRuntime(1827):     ... 11 more
04-30 10:21:04.048: E/Trace(1863): error opening trace file: No such file or directory (2)

我不明白为什么它认为我的位置变量为空。任何建议,将不胜感激。

4

3 回答 3

5

文档指出:

返回一个 Location 指示从给定提供程序获得的最后一个已知位置修复的数据。

这可以在不启动提供程序的情况下完成。请注意,此位置可能已过时,例如,如果设备已关闭并移动到另一个位置。

如果提供程序当前被禁用,则返回 null。

由于您的 GPS 位置为空,您可能还没有打开 GPS,或者您的手机没有 GPS。

将您的代码更改为

Location location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location!=null){
   double longitude = location.getLongitude();
   double latitude = location.getLatitude();
   String locLat = String.valueOf(latitude)+","+String.valueOf(longitude);
}
于 2013-04-30T15:33:37.643 回答
0

LocationManager.GPS_PROVIDER使用手机的 GPS 访问位置)需要一些时间来访问位置,因此您从locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)

onLocationChanged使您的位置对象成为全局对象,并在您的 waypointActivity 中的已实现方法中初始化此对象LocationListener

像这样的东西: -

@Override
public void onLocationChanged(Location location) {
    this.location = location;
}

然后在将其用作之前检查该位置是否不为空:-

    if (location!=null){
       double longitude = location.getLongitude();
       double latitude = location.getLatitude();
       String locLat = String.valueOf(latitude)+","+String.valueOf(longitude);
    }

我建议你使用LocationManager.NETWORK_PROVIDERinsted,因为它给出的结果比GPS_PROVIDER.

于 2013-04-30T16:30:13.557 回答
0

这不是“修复”,而是“解决方法”:

我的 GPS 位置也有同样的问题,尽管我的位置似乎是“通过 adb 重新安装应用程序后返回的第一个位置”,这说明提供商尚未初始化。(因为重新安装应用程序会删除任何以前的已知位置)

这导致我试图完成的任何 GPS 任务在第一次触发时总是失败并返回 null(所有提供程序),但在重新启动时按预期工作。

我的主管和大学建议我通过简单地开始 gps 更新并丢弃第一个位置,立即移动到下一个位置并正常从那里继续(检测和/或处理从那时起返回的任何空位置)来简单地解决该问题意外行为)

虽然这对我有用,但我仍然对这实际上应该如何以最佳实践解决感兴趣?

希望这有助于有人在此期间继续工作。

于 2020-02-22T14:27:18.573 回答