2011-08-01 1 views
0

ボタンをクリックしたときにユーザーの場所を取得しようとしています。
私は、ボタンのonclickリスナーに次のコードを持っている:
ロケーションマネージャアンドロイドの問題

 

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
bestProvider = locationManager.getBestProvider(criteria, false); 
Location currentLocation = locationManager.getLastKnownLocation(bestProvider); 
Log.e(tag,"reached till here"); 
location = Double.toString(currentLocation.getLatitude()) + " " + Double.toString(currentLocation.getLongitude()); 
Toast.makeText(getApplicationContext(), location, Toast.LENGTH_LONG); 
MyLocation.setText(location); 
 

私はlogcatに出力reached till hereを取得しています。その後、アプリケーションが停止し、強制的に閉じるように求められます。私は最初にいくつかの検索を行い、getLatitudeとgetLongitudeがdouble値を返すことを発見しました。そこでコードを修正しました。しかし、まだ私はエラーが発生しています。私は間違って何をしていますか?

EDIT: logcatエラー:のsetActiveを送る
ガットはRemoteException 796のuid 10036
をがpidに(false)を通知私は、あなたはあなたがおそらくEmulatorでアプリケーションをテストしている場合currentLocationがnull

+0

デバッグし、あなたのオブジェクト「currentLocationは」nullであるかどうかを確認することができますか?また、あなたがlogcatで取得したエラーは何ですか? – Finuka

+0

なぜそれがクラッシュするのかを見つけるためにlogcatを投稿してください。 – PravinCG

+0

ログを表示してください。最後に知られている場所がないかもしれません。次に、代わりにnullを取得します。 – TofferJ

答えて

3

を返していると思いますプロバイダーがなく、currentLocationオブジェクトがnullであるため、getLatitude()getLongitude()はNPEを提供します。

編集:@grinnnerによると、DDMSの観点から、位置座標の送信をシミュレートすることができます。 eclipseでDDMSパースペクティブを開き、[LocationControls]タブで経度と緯度を設定して[送信]をクリックします。 [デバイス]タブのフォーカスは、アプリを実行しているエミュレータ上にあることを確認してください。

+0

Eclipseを使用している場合、彼はDDMSの観点からその場所を偽装することができます。 – thegrinner

+0

エミュレータを使用している場合、プロバイダを取得する方法を教えてください。 – Brahadeesh

+0

@thegrinner私はそれをする方法を知らない。あなたはステップをしてください説明することはできますか? – Brahadeesh

1

最後に既知の場所がない場合(返された値の単純なヌルチェックのみ)、ロケーションリスナーを追加して場所を取得する必要があります。このような何か:

// Start listening for a new location. 
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
String bestProvider = lm.getBestProvider(new Criteria(), true);  
mMyLocationListener = new MyLocationListener(); 
lm.requestLocationUpdates(bestProvider, 0, 0, mMyLocationListener); 

private class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     // Do what you need to do with the longitude and latitude here. 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
} 

ます。また、すぐにあなたは、もはやそれを必要としないので、場所リスナーを削除するために覚えておく必要があります:あなたは

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
lm.removeUpdates(mMyLocationListener); 
mMyLocationListener = null; 
+0

私は場所の更新をしたくない。私はちょうど場所を一度見つけたいと思う。私はこのリスナーを実装するクラス内にこのコードを持っています。 – Brahadeesh

+0

あなたが最後に知られている場所を持っていない場合、あなたは一度だけ場所をしたい場合でも、私はこれを得るための唯一の方法だと思う。リスナーを登録し、更新を取得したらすぐにそのリスナーを削除し、取得した場所を使用します。しかし、エミュレータがあなたに提供していないという問題がある場合は、Ovidiuの答えを参照してください。 :) – TofferJ

+0

うん。彼の答えに私の最後のコメントをチェックしてください。あなたの答えをありがとう。 – Brahadeesh

関連する問題