私はアンドロイド開発の使い方を学んでいて、それを試してみて、「近接アラーム」を作りたいと思っています。あるポイントに近づいたら、アラームを鳴らす必要があります。
まず、ポイントと現在地の間の距離を計算するループを作成し、距離が 1 未満の場合はアラームを鳴らします。
大丈夫ですが...論理的には、アラームを設定すると他のアプリケーションをプレイできますが、私の場合はどうなりましたか??
onPaused() メソッドを使用する必要がありますか? 多分スレッドを作成しますか?? 私はこの瞬間に迷っています、誰かが方法を知っていますか? o アドバイスをください。
ありがとうございます =)
これは私のコードです...現在asyncTaskを使用していますが、明らかに機能しません。
public class RunActivity は MapActivity を拡張します {
private MapView map;
private MapController mapControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_run);
this.map = (MapView)findViewById(R.id.map);
this.map.setBuiltInZoomControls(true);
this.mapControl = map.getController();
GeoPoint centro = new GeoPoint((int)(40.463667 * 1E6), (int)(-3.749220 * 1E6));
this.mapControl.setCenter(centro);
this.mapControl.setZoom(10);
List<Overlay> capas = this.map.getOverlays();
MyLocationOverlay mOverlayLocation = new MyLocationOverlay(this, this.map);
mOverlayLocation.enableMyLocation();
mOverlayLocation.enableCompass();
capas.add(mOverlayLocation);
this.map.postInvalidate();
MiTareaAsincrona Ejemplo = new MiTareaAsincrona();
Ejemplo.execute(RunActivity.this);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
class MiTareaAsincrona extends AsyncTask<Context, Double, Boolean> {
private boolean finish = false;
private double target_lat;
private double target_lon;
protected void onPreExecute() {
Bundle Datos = getIntent().getBundleExtra("Datos");
this.target_lat = Datos.getInt("LATITUD");
this.target_lon = Datos.getInt("LONGITUD");
}
protected Boolean doInBackground(Context... context) {
LocationManager manager = (LocationManager)context[0].getSystemService(Context.LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
double actual_lat;
double actual_lon;
Bundle Datos = getIntent().getBundleExtra("Datos");
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onLocationChanged(Location location) {
actual_lat = location.getLatitude()*1E6;
actual_lon = location.getLongitude()*1E6;
if (distance(actual_lat, actual_lon, target_lat, target_lon) < Datos.getInt("DISTANCIA")) {
finish = true;
}
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
return finish;
}
protected void onProgressUpdate() { }
protected void onPostExecute(Boolean result) {
if (finish) {
Log.v("OJU", "MIARMA");
}
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: This function converts decimal degrees to radians :*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
private double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515 * 1.609344 * 1000; // en metros
return (dist);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: This function converts decimal degrees to radians :*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: This function converts radians to decimal degrees :*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
}
}