GPS のみに基づいた Android コンパスを作成したいと思います。私が開発しているデバイスには、加速度計や磁場センサーがありません。そのため、android.location クラスのみに依存する必要があります。
これまでのところ、現在の GPS 座標を表示するために LocationManager にアクセスすることはうまくいきます (以下を参照)。どうするのが一番良いのか悩んでいます。現在の座標と地理的な北座標を既知の値として使用して、方向を計算します。
このアプローチが理にかなっているのか、コードを共有しているのか、誰にでもアドバイスできますか?
これまでに得たコードは次のとおりです。
public class CompassActivity extends Activity implements LocationListener {
Compass myCompass;
private TextView mInfoText;
private LocationManager mLoc;
private static final Integer MINIMUM_UPDATE_INTERVAL = 5000; //update every 5s
private static final Integer MINIMUM_UPDATE_DISTANCE = 5; //update every 5m
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compass);
myCompass = (Compass)findViewById(R.id.mycompass);
mInfoText = (TextView) findViewById(R.id.infotext);
mLoc = (LocationManager) getSystemService(LOCATION_SERVICE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.compass, menu);
return true;
}
@Override
protected void onResume() {
mLoc.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_UPDATE_INTERVAL, MINIMUM_UPDATE_DISTANCE, this);
super.onResume();
}
@Override
protected void onPause() {
mLoc.removeUpdates(this);
super.onPause();
}
@Override
protected void onStop() {
finish();
super.onStop();
}
@Override
public void onLocationChanged(Location loc) { //display coordinates
System.out.println(loc.toString());
String title = "Current location: ";
final StringBuilder sb = new StringBuilder(title);
sb.append("Longitude: ");
sb.append(loc.getLongitude());
sb.append("Latitude: ");
sb.append(loc.getLatitude());
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfoText.setText(sb.toString());
}
});
}
@Override
public void onProviderDisabled(String provider){ // message if GPS is disabled
Toast.makeText(this, "GPS disabled", Toast.LENGTH_LONG).show();
AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
alertbox.setMessage("Please activate GPS!");
alertbox.setNeutralButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
}
);
alertbox.show();
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "GPS enabled", Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle b) { // called upon GPS status changes
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
Toast.makeText(this, "Status changed: out of service", Toast.LENGTH_LONG).show();
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Toast.makeText(this, "Status changed: temporarily unavailable", Toast.LENGTH_LONG).show();
break;
case LocationProvider.AVAILABLE:
Toast.makeText(this, "Status changed: available", Toast.LENGTH_LONG).show();
break;
}
}
}