ユーザーの場所を取得できるアプリを実装しています。ただし、LocationManager がすべてのデバイスで常に機能するとは限らないことがわかりました。さまざまな Android デバイスがたくさんあります。次に、生の gps データを取得し、それを位置情報 Web サービスに送信して位置情報を取得することを考えています。
SO を見回した後、堅牢なソリューションを取得できませんでした。何か考えはありますか? 市場に出回っている一部の GPS アプリがすべてのデバイスでどのように機能するのか、非常に興味があります。
コードスニペット
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
MyLocationListener locationListener = new MyLocationListener(locationManager);
locationListener.start();
リスナー、
public class MyLocationListener implements LocationListener{
public static int PERMISSION_DENIED = 1;
public static int POSITION_UNAVAILABLE = 2;
public static int TIMEOUT = 3;
protected LocationManager locationManager;
protected boolean running = false;
public MyLocationListener(LocationManager locationManager )
{
this.locationManager = locationManager;
}
public void onProviderDisabled(String provider) {
Log.d(TAG, "Location provider '" + provider + "' disabled.");
}
public void onProviderEnabled(String provider) {
Log.d(TAG, "Location provider "+ provider + " has been enabled");
}
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d(TAG, "The status of the provider " + provider + " has changed");
if (status == 0) {
Log.d(TAG, provider + " is OUT OF SERVICE");
}
else if (status == 1) {
Log.d(TAG, provider + " is TEMPORARILY_UNAVAILABLE");
}
else {
Log.d(TAG, provider + " is AVAILABLE");
}
}
public void onLocationChanged(Location location) {
Log.d(TAG, "The location has been updated!");
Log.d(TAG, "latitude = "+location.getLatitude()+" altitude = "+location.getAltitude());
}
public void start() {
if (!this.running) {
if (this.locationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
this.running = true;
Log.d(TAG,"using gps");
this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 600000, 0, this);
} else {
Log.d(TAG, "GPS provider is not available.");
}
}
if (!this.running) {
if (this.locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) {
this.running = true;
Log.d(TAG,"using network");
this.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 600000, 10, this);
} else {
Log.d(TAG, "Network provider is not available.");
}
}
}
private void stop() {
if (this.running) {
this.locationManager.removeUpdates(this);
this.running = false;
}
}
/**
* Destroy listener.
*/
public void destroy() {
this.stop();
}
場合によっては、onStatusChanged が何も得られないこともあります。