Manera práctica de saber si se han enviado SMS

Estoy interesado en cómo puedo averiguar si se ha enviado un SMS desde el dispositivo.

Para recibir una notificación cuando se reciben los SMS, utilizamos una emisora ​​con:

android.provider.Telephony.SMS_RECEIVED 

Es importante mencionar que no envío mensajes de texto desde mi aplicación, solo debo escuchar cuando se envía un SMS desde el dispositivo.

Puede ser que debería escuchar a algún proveedor de contenido (que de alguna manera se relaciona con los SMS) y reactjsr ante ese cambio. ¿Alguna idea de cómo puedo lograr eso?

Sí, es posible escuchar SMS ContentProvider utilizando ContentObserver

Aquí está mi ejemplo para SMS salientes:

Primero registra un ContetObserver con contenido: // sms /

  public class Smssendservice extends Service{ @Override public void onCreate() { SmsContent content = new SmsContent(new Handler()); // REGISTER ContetObserver this.getContentResolver(). registerContentObserver(Uri.parse("content://sms/"), true, SMSObserver); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } 

SMSObserver.class

  public class SMSObserver extends ContentObserver { private Handler m_handler = null; public SMSObserver(SMSLogger handler){ super(handler); m_handler = handler; } @Override public void onChange(boolean selfChange) { super.onChange(bSelfChange); Uri uriSMSURI = Uri.parse("content://sms"); Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String protocol = cur.getString(cur.getColumnIndex("protocol")); if(protocol == null) { //the message is sent out just now } else { //the message is received just now } } } } 

utilice el siguiente método para enviar sms y verifique si el sms se entrega o no.

 send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String phoneNo = "Phone number to sent"; String message = "Your message"; if (phoneNo.length() > 0 && message.length() > 0) { TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); int simState = telMgr.getSimState(); switch (simState) { case TelephonyManager.SIM_STATE_ABSENT: displayAlert(); break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED: // do something break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: // do something break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: // do something break; case TelephonyManager.SIM_STATE_READY: // do something sendSMS(phoneNo, message); // method to send message break; case TelephonyManager.SIM_STATE_UNKNOWN: // do something break; } } else { Toast.makeText(getBaseContext(), "Please enter both phone number and message.", Toast.LENGTH_SHORT).show(); } } private void displayAlert() { // TODO Auto-generated method stub new AlertDialog.Builder(YourActivity.this) .setMessage("Sim card not available") .setCancelable(false) // .setIcon(R.drawable.alert) .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Log.d("I am inside ok", "ok"); dialog.cancel(); } }) .show(); } }); private void sendSMS(String phoneNumber, String message) { String SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; PendingIntent sentPI = PendingIntent.getBroadcast(YourActivity.this, 0, new Intent(SENT), 0); PendingIntent deliveredPI = PendingIntent.getBroadcast(YourActivity.this, 0, new Intent(DELIVERED), 0); // ---when the SMS has been sent--- final String string = "deprecation"; registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(YourActivity.this, "SMS sent", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(YourActivity.this, "Generic failure", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(YourActivity.this, "No service", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(YourActivity.this, "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(SENT)); // ---when the SMS has been delivered--- registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(YourActivity.this, "SMS delivered", Toast.LENGTH_SHORT).show(); break; case Activity.RESULT_CANCELED: Toast.makeText(YourActivity.this, "SMS not delivered", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(DELIVERED)); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); } 

Una cosa que me viene a la mente es usar el log log log. Cada vez que se envía / recibe un SMS hay una entrada específica. Simplemente conecte su teléfono en depuración y prueba y observará la entrada específica.

Debo mencionar que este método se hace desde su aplicación, por lo que puede trabajar en su código.

Toma un tirón de esto . Puede haber otros métodos, pero parece bastante fácil y factible.