Sending SMS using intent and know if SMS was sent or not

I tried to send sms via Intent using this code:

Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("smsto:" + phoneNumber)); intent.putExtra("address", phoneNumber); intent.putExtra("sms_body", messageBody); intent.putExtra("exit_on_sent", true); startActivityForResult(intent, CODE); 

Then, I want to know if an SMS was sent or not, and I use this code:

 public void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (requestCode) { case CODE: if (resultCode == Activity.RESULT_OK) { //Then do... } elseif(resultCode == Activity.RESULT_CANCELED) { // Do... } break; } } 

Thing - the result is always 0 (Activity.RESULT_CANCELED), even when an SMS is sent. How do I know if an SMS has been sent or not? I want to use the default SMS application for the phone, and not create an interface that sends SMS.

+5
source share
1 answer

In the following example, we use ContentObserver to monitor updates for the SMS provider. This observer is created and started before SMS Intent is launched, and verifies that the provider has changed the recipient address. The operation that creates the Observer must implement the SmsSendObserver.SmsSendListener interface to receive the callback.

The Observer constructor includes the timeout parameter (in milliseconds) to allow the Observer to be properly unregistered if the message is not sent after a reasonable time. Optionally, set the value to NO_TIMEOUT . However, the class, as it is written, is intended to be used "in one shot", and it will unregister and revoke the participants after the callback. The stop() method can be used to clear if no callback occurs. In any case, the instance is no longer used, and any reference to it must be null.

Example:

 public class MainActivity extends Activity implements SmsSendObserver.SmsSendListener { ... private void sendMessage(String phoneNumber, String messageBody) { // This example has a timeout set to 15 seconds new SmsSendObserver(this, phoneNumber, 15000).start(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("smsto:" + phoneNumber)); intent.putExtra("address", phoneNumber); intent.putExtra("sms_body", messageBody); intent.putExtra("exit_on_sent", true); startActivity(intent); } public void onSmsSendEvent(boolean sent) { Toast.makeText(this, sent ? "Message was sent" : "Timed out", Toast.LENGTH_SHORT).show(); } } 

SmsSendObserver Class:

 public class SmsSendObserver extends ContentObserver { public static final int NO_TIMEOUT = -1; private static final Handler handler = new Handler(); private static final Uri uri = Uri.parse("content://sms/"); private static final String COLUMN_ADDRESS = "address"; private static final String COLUMN_TYPE = "type"; private static final String[] PROJECTION = { COLUMN_ADDRESS, COLUMN_TYPE }; private static final int MESSAGE_TYPE_SENT = 2; private Context context = null; private ContentResolver resolver = null; private String phoneNumber = null; private long timeout = NO_TIMEOUT; private boolean wasSent = false; private boolean timedOut = false; public SmsSendObserver(Context context, String phoneNumber, long timeout) { super(handler); if (context instanceof SmsSendListener) { this.context = context; this.resolver = context.getContentResolver(); this.phoneNumber = phoneNumber; this.timeout = timeout; } else { throw new IllegalArgumentException( "Context must implement SmsSendListener interface"); } } private Runnable runOut = new Runnable() { @Override public void run() { if (!wasSent) { timedOut = true; callBack(); } } }; public void start() { if (resolver != null) { resolver.registerContentObserver(uri, true, this); if (timeout > NO_TIMEOUT) { handler.postDelayed(runOut, timeout); } } else { throw new IllegalStateException( "Current SmsSendObserver instance is invalid"); } } public void stop() { if (resolver != null) { resolver.unregisterContentObserver(this); resolver = null; context = null; } } private void callBack() { ((SmsSendListener) context).onSmsSendEvent(wasSent); stop(); } @Override public void onChange(boolean selfChange) { if (wasSent || timedOut) return; Cursor cursor = null; try { cursor = resolver.query(uri, PROJECTION, null, null, null); if (cursor != null && cursor.moveToFirst()) { final String address = cursor.getString(cursor.getColumnIndex(COLUMN_ADDRESS)); final int type = cursor.getInt(cursor.getColumnIndex(COLUMN_TYPE)); if (PhoneNumberUtils.compare(address, phoneNumber) && type == MESSAGE_TYPE_SENT) { wasSent = true; callBack(); } } } finally { if (cursor != null) { cursor.close(); } } } public interface SmsSendListener { // Passes true if the message was sent // Passes false if timed out public void onSmsSendEvent(boolean sent); } } 
+9
source

Source: https://habr.com/ru/post/1203571/


All Articles