-2

以下代码将每 30 秒更新一次用户位置,如果位置大于半径,则进行一些计算,然后将 SMS 消息发送到电话号码。

我的问题是,如何每 5 分钟发送一次 SMS 消息并每 30 秒更新一次位置?

怎么能做到这一点?有什么建议吗?

  /*
 * Constants for location update parameters
 */
// Milliseconds per second
public static final int MILLISECONDS_PER_SECOND = 1000;

// The update interval
public static final int UPDATE_INTERVAL_IN_SECONDS = 30;///////////////////////////////////////////

// A fast interval ceiling
public static final int FAST_CEILING_IN_SECONDS = 1;

// Update interval in milliseconds
public static final long UPDATE_INTERVAL_IN_MILLISECONDS =
        MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;

// A fast ceiling of update intervals, used when the app is visible
public static final long FAST_INTERVAL_CEILING_IN_MILLISECONDS =
        MILLISECONDS_PER_SECOND * FAST_CEILING_IN_SECONDS;


// A request to connect to Location Services
private LocationRequest mLocationRequest;

/*
 * Note if updates have been turned on. Starts out as "false"; is set to "true" in the
 * method handleRequestSuccess of LocationUpdateReceiver.
 *
 */
boolean mUpdatesRequested = false;


@Override
protected void onCreate(Bundle savedInstanceState) {////////////////////////////////////////////
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_patient__tracing);
    info = (TextView) findViewById(R.id.info);
    if (servicesConnected()) ///////////////////////////////////////////////////////////////////
    {
        /*
         * Create a new location client, using the enclosing class to
         * handle callbacks.
         */
        googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

    }
    // Create a new global location parameters object
    mLocationRequest = LocationRequest.create();

    /*
     * Set the update interval - This acts as minimum which values are requested from the app
     */
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);

    // Use high accuracy
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    // Set the interval ceiling to one second - This acts as maximum which get fed when location is available by other apps
    mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING_IN_MILLISECONDS);

    // Note that location updates are off until the user turns them on
    mUpdatesRequested = false;


    ToggleButton button = (ToggleButton) findViewById(R.id.serviceSwitch);

    button.setChecked(mUpdatesRequested);


    button.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton button, boolean isChecked) {


            if (!isChecked) {

                stopPeriodicUpdates();
            } else
                startPeriodicUpdates();

        }
    });


}

/**
 * Verify that Google Play services is available before making a request.
 *
 * @return true if Google Play services is available, otherwise false
 */
private boolean servicesConnected() {

    // Check that Google Play services is available
    int resultCode =
            GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    // If Google Play services is available
    if (ConnectionResult.SUCCESS == resultCode) {


        Log.d(this.getClass().getSimpleName(), "available " + "");

        // Continue
        return true;
        // Google Play services was not available for some reason
    } else {

        Log.d(this.getClass().getSimpleName(), "not available " + "");

        return false;
    }
}

/*
 * Called when the Activity is restarted, even before it becomes visible.
 */
@Override
public void onStart() {

    super.onStart();

    /*
     * Connect the client. Don't re-start any requests here;
     * instead, wait for onResume()
     */
    googleApiClient.connect();

}

/*
 * Called when the Activity is no longer visible at all.
 * Stop updates and disconnect.
 */
@Override
public void onStop() {

    stopPeriodicUpdates();
    // After disconnect() is called, the client is considered "dead".
    googleApiClient.disconnect();

    super.onStop();
}


@Override
public void onConnectionFailed(ConnectionResult result) {

    Log.d(this.getClass().getSimpleName(), "onConnectionFailed " + "");
    //TODO inform user there is somehting wrong
}

@Override
public void onConnected(Bundle connectionHint) {


    Log.d(this.getClass().getSimpleName(), "onConnected ");
    //TODO do things here

    getCurrentLocation();
}

private void getCurrentLocation() {

    if (googleApiClient.isConnected()) {
        Location loc = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        double lat = loc.getLatitude();
        double lon = loc.getLongitude();
        double alt = loc.getAltitude();
        float acc = loc.getAccuracy();
        long time = loc.getTime();
        String loc_info = "lat: " + lat + " lon: " + lon + " alt: " + alt + " acc: " + acc + " time: " + time;
        Log.d(this.getClass().getSimpleName(), loc_info);

    }


}


/**
 * In response to a request to start updates, send a request
 * to Location Services
 */
private void startPeriodicUpdates() {//////////////////////////////////////////

    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, mLocationRequest, this);
}


@Override
public void onLocationChanged(Location loc) {///////////////////////////
    //Location update
    double lat1=22.762503862128362;// must be at create
    double lon1=39.08618710935116;//must in create take it from main region table
    double lat = loc.getLatitude();
    double lon = loc.getLongitude();
    double alt = loc.getAltitude();
    float acc = loc.getAccuracy();
    long time = loc.getTime();
    String loc_info ="location Chaned lat: " + lat +" lon: " + lon  +" alt: " + alt + " acc: " + acc +" time: " + time;
    Log.d(this.getClass().getSimpleName(), loc_info );
    CalculateDis(lat1,lon1,lat,lon);
    new insertUserTask(lat,lon).execute();
    info.setText(loc_info);





} double raduis=15;

  private void CalculateDis(double lat1,double lon1,double lat2,double lon2){

      double earth_raduis=6371000;//METERS
      double lat1Rad=Math.toRadians(lat1);
      double lat2Rad=Math.toRadians(lat2);
      double diffLongRad=Math.toRadians(lon2-lon1);
      double a=Math.sin(lat1Rad)*Math.sin(lat2Rad);
      double b=Math.cos(lat1Rad)*Math.cos(lat2Rad)*Math.cos(diffLongRad);
      double radDis=Math.acos(a+b);
      double distance=radDis*earth_raduis;
      if (distance>raduis){
          Toast.makeText(getApplicationContext(), "patient out side" , Toast.LENGTH_SHORT).show();

           String phoneNo="0555555555";

          String sms =    "text Sms"  ;

          Toast.makeText(getApplicationContext(), "patient out side" , Toast.LENGTH_SHORT).show();

          try{
          SmsManager smsManager = SmsManager.getDefault();
              ArrayList<String> parts = smsManager.divideMessage(sms);
              smsManager.sendMultipartTextMessage(phoneNo, null, parts, null, null);

              Toast.makeText(getApplicationContext(), "SMS Sent!",
                      Toast.LENGTH_LONG).show();}
          catch (Exception e){
              Toast.makeText(getApplicationContext(),
                      "SMS faild, please try again later!",
                      Toast.LENGTH_LONG).show();
              e.printStackTrace();


          }


      }

      else
          Toast.makeText(getApplicationContext(), "patient in side" , Toast.LENGTH_SHORT).show();



  }
4

1 回答 1

0

基本上你需要 CountDownTimer 类(可能解决方案的一个实例)。我成功地使用了我自己的项目。我希望它会有所帮助。

public class MyCountDownTimer extends CountDownTimer {
      public MyCountDownTimer(long startTime, long interval) {
       super(startTime, interval);
      }

      @Override
      public void onFinish() {
        //send sms
      }

      @Override
      public void onTick(long millisUntilFinished) {
          long time = millisUntilFinished / 1000;
          Log.v("timer: ", ""+time);
      }
     }

//use it like
private final long startTime = 30 * 1000; //it is 30 second change it for your own requirement
private final long interval = 1 * 1000; // 1 second interval

CountDownTimer cDownTimer = new MyCountDownTimer(startTime, interval);
//and start timer using
cDownTimer.start();
//and stop timer using
cDownTimer.cancel();
 // something like that
于 2015-04-13T06:34:10.700 回答