Search code examples
androidandroid-broadcastandroid-locationandroid-sms

Sending Sms in Android on reaching a Location


I am an absolute beginner in android.In this code i want to send sms on reaching a particular location. My app crashes if i put Sms manager outside onlocationchange()function.So it is sending continuous sms if Im not coming out of the 10m distance.I just want to make it to send only one sms. Please help!!

MainActivity.java

    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtLat = (TextView) findViewById(R.id.textview1);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    try {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,10, this);
    } catch (SecurityException e)
    {
        txtLat = (TextView) findViewById(R.id.textview1);
        txtLat.setText("Security Exception");

    }
}

@Override
public void onLocationChanged(Location location) {
    txtLat = (TextView) findViewById(R.id.textview1);
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
    float dist1=getsignaldistance(location);
    tx=(TextView)findViewById((R.id.textview2));
    tx.setText("Distance for next signal:"+Float.toString(dist1)+"m");
    checksendsms(location);
}

private void checksendsms(Location location) {
    Location strpoint=new Location("strpoint");
    strpoint.setLatitude(location.getLatitude());
    strpoint.setLongitude(location.getLongitude());
    Location endpoint=new Location("endpoint");
    endpoint.setLatitude(10.813763);
    endpoint.setLongitude(78.644309);
    float dist=strpoint.distanceTo(endpoint);
    tx=(TextView)findViewById((R.id.textview3));
    tx.setText("Distance between points:"+Float.toString(dist)+"m");
    if(dist<=10.0)
    {
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phonenumber, null, message, null, null);
        finish();
    }

}

Solution

  • You need to keep a flag (boolean) that indicate if the sms has already been sent.

    private boolean mHasSmsBeenSent = false; // <--- HERE
    
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtLat = (TextView) findViewById(R.id.textview1);
    
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        try {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,10, this);
        } catch (SecurityException e)
        {
            txtLat = (TextView) findViewById(R.id.textview1);
            txtLat.setText("Security Exception");
    
        }
    }
    
    @Override
    public void onLocationChanged(Location location) {
        txtLat = (TextView) findViewById(R.id.textview1);
        txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
        float dist1=getsignaldistance(location);
        tx=(TextView)findViewById((R.id.textview2));
        tx.setText("Distance for next signal:"+Float.toString(dist1)+"m");
        if(!mSmsHasBeenSent) {        // <-- HERE
            checksendsms(location);
        }
    }
    
    private void checksendsms(Location location) {
        Location strpoint=new Location("strpoint");
        strpoint.setLatitude(location.getLatitude());
        strpoint.setLongitude(location.getLongitude());
        Location endpoint=new Location("endpoint");
        endpoint.setLatitude(10.813763);
        endpoint.setLongitude(78.644309);
        float dist=strpoint.distanceTo(endpoint);
        tx=(TextView)findViewById((R.id.textview3));
        tx.setText("Distance between points:"+Float.toString(dist)+"m");
        if(dist<=10.0)
        {
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(phonenumber, null, message, null, null);
            mHasSmsBeenSent = true; // <--- HERE
            finish();
        }
    
    }