乾杯、Android経由で現在のGPSロケーションを取得しようとしています。 このチュートリアル と Vogellasの記事 に従いました。それは機能していませんが。 LocationManager.NETWORK_PROVIDERを使用するとき、私は常に51の緯度と9の経度を取得しています-私がどこにいても。 LocationManager.GPS_PROVIDERを使用すると、何も得られません。
GMapsを使用するとすべてが機能しますが:S理由はわかりません。 GMapsのように現在のGPS位置を取得するにはどうすればよいですか?
ここに私のコードがあります:
package com.example.gpslocation;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Context;
import Android.util.Log;
import Android.view.Menu;
public class GPS_Location extends Activity implements LocationListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gps__location);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.gps__location, menu);
return true;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
Log.i("Geo_Location", "Latitude: " + latitude + ", Longitude: " + longitude);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
問題は次のとおりです。
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
緯度と経度は、位置を度単位で表すため、double
-値です。
それらをint
にキャストすることにより、コンマの後ろのすべてを破棄することになり、大きな違いが生じます。 "Decimal Degrees-Wiki" を参照してください。
試してみる :
public LatLng getLocation()
{
// Get the location manager
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(bestProvider);
Double lat,lon;
try {
lat = location.getLatitude ();
lon = location.getLongitude ();
return new LatLng(lat, lon);
}
catch (NullPointerException e){
e.printStackTrace();
return null;
}
}
このコードには1つの問題があります。
int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());
int
をdouble
に変更できます
double latitude = location.getLatitude();
double longitude = location.getLongitude();
最初の問題は、lat
とlon
をdoubleに変更することで解決されます。
Location location = locationManager.getLastKnownLocation(bestProvider);
を使用してソリューションにコメントを追加したいのですが、他のアプリがそのためにリスニングしている最後の既知の場所を見つけるのに役立ちます。たとえば、デバイスの起動後にアプリがこれを実行しなかった場合、コードはゼロを返します(最近、それを把握するためにしばらく時間を費やしました)。
また、locationManager.removeUpdates(this);
を使用する必要がない場合は、リスニングを停止することをお勧めします
また、manifest
に権限がある場合でも、デバイスのAndroid設定で位置情報サービスが有効になっている場合、コードは機能します。
抜粋:-
try
{
cnt++;scnt++;now=System.currentTimeMillis();r=Rand.nextInt(6);r++;
loc=lm.getLastKnownLocation(best);
if(loc!=null){lat=loc.getLatitude();lng=loc.getLongitude();}
Thread.sleep(100);
handler.sendMessage(handler.obtainMessage());
}
catch (InterruptedException e)
{
Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
}
上記を見るとわかるように、スレッドはユーザーインターフェイスアクティビティのメインスレッドと並行して実行されており、現在の時刻とランダムなダイススローとともにGPS latを継続的に表示します。
好奇心が強い場合は、完全なコードを確認してください: ランダムなサイコロを投げるGPS位置と別のスレッドの現在時刻