1

私はアンドロイド開発の使い方を学んでいて、それを試してみて、「近接アラーム」を作りたいと思っています。あるポイントに近づいたら、アラームを鳴らす必要があります。

まず、ポイントと現在地の間の距離を計算するループを作成し、距離が 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);
    }       

}

}

4

0 に答える 0