2012-03-31 7 views
1

MapViewを使用するアプリがあり、ユーザーの緯度、経度、水平精度が一部のラベルに印刷されます。これはすべて私のHTC Wildfireでうまくいきますが、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の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

を試みると場所を必要とするコードを囲むことによってこれに対処する必要がありますか? –

+0

@Alex私はちょうどlogcatの出力でQを更新しました - NullPointerExceptionと思われます – PinkFloydRocks

答えて

3

LocationManager.getLastKnownLocation()はnullを返すことができるためです。

あなたのコードでは、GPSプロバイダにあなたの現在地の更新を依頼しました。 しかし、デバイスのGPSがオフの場合、そのメソッドはnullを返します。

また、LocationManagerでリクエストが処理されていない場合は、LocationManager.getLastKnownLocation()もnull値を返します。 LocationManagerには「Last Known Locations」の値がありません。

あなたのコードスニペットで成功を取得したい場合は、お使いのデバイスのGPSがONになっている、

$adb shell dumpsys location 

ので(あなたはADB以下のコマンドでLocationManagerの状態を確認することができます)とLocationManagerは「前回の場所」

を持っています

まあ、私もLocationManager.getLastKnownLocation()メソッドを使用しますが、わずかに異なります。

LocationManager.getLastKnownLocation()メソッドで「最後に既知の場所」の値があるかどうかを確認します。それは現在の位置価値を解決する最速の方法なので。 しかし、nullを返した場合は、requestLocationUpdatesによって位置更新を要求してください。

技術的な解決デバイスの位置もありますが、私はそれが大きな答えになると思います。 代わりに、私はこのvideoをリンクします。これは場所に関する素晴らしい説明です。 (および他の多くのヒント!!)

1

それがすべてで修正を受けていない場合は、その行の後

Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

場所はnullになります。したがって、あなたは

if (location != null){ 
    // your code 
} 
+0

ええ - 私は質問を投稿した直後にこれを見つけ出し、それに自分自身で答えるつもりでしたが、できるだけ早く7時間待たなければなりませんでした。しかし、答えをありがとう! – PinkFloydRocks

1

またはそれがLogCatたときにクラッシュして何を印刷しないこの

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) 
     } 
    } 
} 
関連する問題