【问题标题】:Why does my app crash when trying to get latitude and longitude values Android为什么我的应用程序在尝试获取纬度和经度值时崩溃 Android
【发布时间】:2013-09-11 18:16:27
【问题描述】:

我正在开发一个应用程序,用户需要在该应用程序中提供他们的纬度和经度位置才能发布任何信息。问题是当我使用以下代码时:

/********************************************************************
* GET LATITUDE                                                      *
********************************************************************/
public String getLatitude(){
    LocationManager lm = (LocationManager) ACTIVITY.getSystemService(Context.LOCATION_SERVICE); 

    if( lm.isProviderEnabled( LocationManager.GPS_PROVIDER )){
        Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if(location != null){
            return Double.toString( location.getLatitude() );
        }
    }
    return null;
}


/********************************************************************
* GET LONGITUDE                                                     *
********************************************************************/
public String getLongitude(){
    LocationManager lm = (LocationManager) ACTIVITY.getSystemService(Context.LOCATION_SERVICE); 

    if( lm.isProviderEnabled( LocationManager.GPS_PROVIDER )){
        Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if(location != null){
            return Double.toString( location.getLongitude() );
        }
    }
    return null;
}

我看到以下错误消息:

12-06 22:31:46.791: W/dalvikvm(1173): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
12-06 22:31:46.811: E/AndroidRuntime(1173): FATAL EXCEPTION: main
12-06 22:31:46.811: E/AndroidRuntime(1173): java.lang.IllegalStateException: Could not execute method of the activity
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.view.View$1.onClick(View.java:3044)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.view.View.performClick(View.java:3511)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.view.View$PerformClick.run(View.java:14105)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.os.Handler.handleCallback(Handler.java:605)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.os.Looper.loop(Looper.java:137)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.app.ActivityThread.main(ActivityThread.java:4424)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at java.lang.reflect.Method.invoke(Method.java:511)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at dalvik.system.NativeStart.main(Native Method)
12-06 22:31:46.811: E/AndroidRuntime(1173): Caused by: java.lang.reflect.InvocationTargetException
12-06 22:31:46.811: E/AndroidRuntime(1173):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at java.lang.reflect.Method.invoke(Method.java:511)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at android.view.View$1.onClick(View.java:3039)
12-06 22:31:46.811: E/AndroidRuntime(1173):     ... 11 more
12-06 22:31:46.811: E/AndroidRuntime(1173): Caused by: java.lang.NullPointerException
12-06 22:31:46.811: E/AndroidRuntime(1173):     at com.example.cay.saati.Helper.getLatitude(Helper.java:100)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at com.example.cay.saati.MenuPage.prepareLoginInformation(MenuPage.java:230)
12-06 22:31:46.811: E/AndroidRuntime(1173):     at  com.example.cay.saati.MenuPage.onClick(MenuPage.java:267)
12-06 22:31:46.811: E/AndroidRuntime(1173):     ... 14 more

我使用以下权限来使用 LocationManager:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

还有图书馆:

<uses-library android:name="com.google.android.maps" />

谁能告诉我具体的问题是什么?是什么导致 java.lang.reflect.invocationTargetException?我不明白。谢谢!

【问题讨论】:

  • 真正的问题是 NullPointerException。

标签: android google-maps latitude-longitude invocationtargetexception


【解决方案1】:

lastKnownLocation 可以返回 null。

gps 使用观察者设计模式工作——你请求它给你一个位置,然后使用一个监听器,它会自己调用相关函数,给你它找到的位置。

【讨论】:

  • 有没有更好的获取地理坐标的方法?
  • @Xarialon 没有。这是方法。您需要了解什么是空指针异常,然后修改您的代码以检查并处理空返回。这是正常的编码。
  • 我知道空指针异常,但我想在 gps 开启时获取坐标。我将搜索观察者设计模式,因为这是我第一次听说。返回 null 很常见,但我想避免这种情况。
  • 因为 GPS 需要时间来获取坐标,所以你告诉它在它准备好后给你。可能需要一秒钟,也可能需要一分钟(例如,如果用户正在通过隧道)。无论如何,观察者设计模式被用在很多地方。使用它的类方法的名称通常为 "set...Listener" 或 "add...Listener" 。对于 GPS,它是“requestLocationUpdates”。
  • 好吧,我认为这个问题很明显,但我想得到一些额外的信息,因为奇怪的原因是我被 null 值弄糊涂了。
【解决方案2】:

即使其他一切正常,lastKnownLocation 也可以为空。就像这里的情况一样: Android LocationManager.getLastKnownLocation() returns null

如果 GPS 正在等待修复,并且没有有效的 lastKnownLocation,则返回 null 实际上是非常明智的。您必须等待修复。

【讨论】:

  • @Xarialon 你可以检查空响应吗?
  • 我可以做些什么来获得协调?有没有更好的方法?
  • 一般来说,找到一个好的位置实际上是相当困难的。摆在我面前的是 175 行代码。对不起,我不能分享它,它是受版权保护的。即使那样,在返回修复程序之前,您也不会得到答案。您可以尝试使用手机定位器服务而不是 GPS,这通常可以更快地获得结果,尽管不是那么精确。
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多