How can I send sms messages in the BACKGROUND using Android?
Asked Answered
I

3

16

I am coming from iphone development where you cannot send an SMS in the background without asking the user to confirm the send. Can sms be sent in the background in android so that no user intervention is need?

Innovation answered 15/6, 2011 at 17:0 Comment(1)
Check out this one #5672064Riddell
C
29

Send SMS with SMS-Delivery notification as toast.

method call as below.

sendSMS("98********","This is test message");

method signature as below — using code that I copied from https://mobiforge.com/design-development/sms-messaging-android

/*
* BroadcastReceiver mBrSend; BroadcastReceiver mBrReceive;
*/
private void sendSMS(String phoneNumber, String message) {
  ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();
  ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();
  PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0,
          new Intent(mContext, SmsSentReceiver.class), 0);
  PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0,
          new Intent(mContext, SmsDeliveredReceiver.class), 0);
  try {
      SmsManager sms = SmsManager.getDefault();
      ArrayList<String> mSMSMessage = sms.divideMessage(message);
      for (int i = 0; i < mSMSMessage.size(); i++) {
          sentPendingIntents.add(i, sentPI);
          deliveredPendingIntents.add(i, deliveredPI);
      }
      sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,
              sentPendingIntents, deliveredPendingIntents);

  } catch (Exception e) {

      e.printStackTrace();
      Toast.makeText(getBaseContext(), "SMS sending failed...",Toast.LENGTH_SHORT).show();
  }

}

Now two more classes SmsDeliveredReceiver,SmsSentReceiver as below.

public class SmsDeliveredReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent arg1) {
      switch (getResultCode()) {
          case Activity.RESULT_OK:
              Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show();
              break;
          case Activity.RESULT_CANCELED:
              Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show();
              break;
      }
   }
}

Now SmsSentReceiver.

public class SmsSentReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent arg1) {
      switch (getResultCode()) {
          case Activity.RESULT_OK:
              Toast.makeText(context, "SMS Sent", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
              Toast.makeText(context, "SMS generic failure", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_NO_SERVICE:
              Toast.makeText(context, "SMS no service", Toast.LENGTH_SHORT)
              .show();
              break;
          case SmsManager.RESULT_ERROR_NULL_PDU:
              Toast.makeText(context, "SMS null PDU", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_RADIO_OFF:
              Toast.makeText(context, "SMS radio off", Toast.LENGTH_SHORT).show();
              break;
      }
   }
}

Now Permissions open your AndroidManifest.xml and add below line

<uses-permission android:name="android.permission.SEND_SMS"/>
Carlos answered 21/11, 2012 at 10:17 Comment(3)
Whats are the intent filter for these broadcast receivers in manifest?Evasion
@Evasion Here are the broadcast receivers to send sms . <receiver android:name=".SmsSentReceiver"/> <receiver android:name=".SmsDeliveredReceiver"/> You can define it in your manifest file.Nitrogenize
it works without two BroadCastReceiver classes. so pending intens and so on.. can use instead: sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,null,null); Thank you very much @sandy;Rigobertorigor
R
20

Yes, you can do it by using:

SmsManager sm = SmsManager.getDefault(); 
sm.sendTextMessage(number, null, message, null, null); 
Riddell answered 15/6, 2011 at 17:10 Comment(2)
@Zubair I have never personally tried it, others have and it works. the link I sent in your question comments mentions it worked.Riddell
Don't forget this in the manifest: <uses-permission android:name="android.permission.SEND_SMS"/>Ultrasound
C
2

Best answer is good but above API level 23 you will need to get the permission pragmatically. Otherwise permission will be prompted each time.

 private static final int PERMISSION_REQUEST_CODE = 1;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

    if (checkSelfPermission(Manifest.permission.SEND_SMS)
            == PackageManager.PERMISSION_DENIED) {

        Log.d("permission", "permission denied to SEND_SMS - requesting it");
        String[] permissions = {Manifest.permission.SEND_SMS};

        requestPermissions(permissions, PERMISSION_REQUEST_CODE);

    }
}
Colloquium answered 23/1, 2018 at 12:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.