Search code examples
androidandroid-gpsandroid-sms

Android- On clicking button the message sending does not stop


I am trying to build an app where I share my location via text message. In the activity I have one button and one TextView. After clicking the button the text message is sent to the specified number provided. The problem is that once I click the button, the message sending does not stop unless I uninstall the application. In one go it sends around 30-40 text messages. The code is given below :

Gps4Activity.java

public class Gps4Activity extends AppCompatActivity implements
    GoogleApiClient.OnConnectionFailedListener {

private static final String LOG_TAG = "PlacesAPIActivity";
private static final int GOOGLE_API_CLIENT_ID = 0;
private GoogleApiClient mGoogleApiClient;
private static final int PERMISSION_REQUEST_CODE = 100;
private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ;
private TextView display1,display2,display3,display4,display5;
private Button button;
String number="+91xxxxxxxxxx";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps4);
    button=(Button)findViewById(R.id.showL);
    display1=(TextView)findViewById(R.id.location2);
    display2=(TextView)findViewById(R.id.location3);
    display3=(TextView)findViewById(R.id.location4);
    display4=(TextView)findViewById(R.id.location5);
    display5=(TextView)findViewById(R.id.location6);

    mGoogleApiClient = new GoogleApiClient.Builder(Gps4Activity.this)
            .addApi(Places.PLACE_DETECTION_API)
            .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this)
            .build();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mGoogleApiClient.isConnected()) {
                if (ActivityCompat.checkSelfPermission(Gps4Activity.this,
                        android.Manifest.permission.ACCESS_FINE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(Gps4Activity.this,
                            new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                            PERMISSION_REQUEST_CODE);
                    ActivityCompat.requestPermissions(Gps4Activity.this,
                            new String[]{Manifest.permission.SEND_SMS},
                            MY_PERMISSIONS_REQUEST_SEND_SMS);
                } else {
                    callPlaceDetectionApi();
                }

            }
        }
    });
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.e(LOG_TAG, "Google Places API connection failed with error code: "
            + connectionResult.getErrorCode());

    Toast.makeText(this,
            "Google Places API connection failed with error code:" +
                    connectionResult.getErrorCode(),
            Toast.LENGTH_LONG).show();
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                callPlaceDetectionApi();
            } else {
                Toast.makeText(getApplicationContext(),
                        "SMS faild, please try again.", Toast.LENGTH_LONG).show();
                return;
            }
            break;

    }
}

private void callPlaceDetectionApi() throws SecurityException {
    PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
            .getCurrentPlace(mGoogleApiClient, null);
    result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
        @Override
        public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
            for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                Log.i(LOG_TAG, String.format("Place '%s' with " +
                                "likelihood: %g",
                        placeLikelihood.getPlace().getName(),
                        placeLikelihood.getLikelihood()));
display2.setText(placeLikelihood.getPlace().getAddress().toString());
SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(number, null, placeLikelihood.getPlace().getAddress().toString(),
                        null, null);
                Toast.makeText(getApplicationContext(), "SMS sent.",
                        Toast.LENGTH_LONG).show();
            }
            likelyPlaces.release();
        }
    });
}
}

Can anyone please suggest a way to check for the number of messages sent. I just want one text message to be sent on button click.

Thank you :)


Solution

  • You are sending message for multiple places, Instead, you can take the best match and send only one message like this or Just break the loop once you send the message.

        private void callPlaceDetectionApi() throws SecurityException {
            PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                    .getCurrentPlace(mGoogleApiClient, null);
            result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
                @Override
                public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
                    //Edited
                    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                        Log.i(LOG_TAG, String.format("Place '%s' with " +
                                        "likelihood: %g",
                                placeLikelihood.getPlace().getName(),
                                placeLikelihood.getLikelihood()));
                        display2.setText(placeLikelihood.getPlace().getAddress().toString());
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(number, null, placeLikelihood.getPlace().getAddress().toString(),
                                null, null);
                        Toast.makeText(getApplicationContext(), "SMS sent.",
                                Toast.LENGTH_LONG).show();
                        break;
                    }
                    likelyPlaces.release();
    //                if(likelyPlaces != null && likelyPlaces.get(0) != null) {
    //                    PlaceLikelihood placeLikelihood = likelyPlaces.get(0);
    //                    Log.i(LOG_TAG, String.format("Place '%s' with " +
    //                                    "likelihood: %g",
    //                            placeLikelihood.getPlace().getName(),
    //                            placeLikelihood.getLikelihood()));
    //                    display2.setText(placeLikelihood.getPlace().getAddress().toString());
    //                    SmsManager smsManager = SmsManager.getDefault();
    //                    smsManager.sendTextMessage(number, null, placeLikelihood.getPlace().getAddress().toString(),
    //                            null, null);
    //                    Toast.makeText(getApplicationContext(), "SMS sent.",
    //                            Toast.LENGTH_LONG).show();
    //                    likelyPlaces.release();
    //                }
    
                }
            });
        }