Extras de Android PendingIntent, no recibidos por BroadcastReceiver

Cuando paso extras a un PendingIntent, el mensaje nunca es recibido por sendBroadcastReceiver, porque el método onReceive() de este BroadcastReceiver nunca se llama. ¿Por qué está pasando esto?

 public class MainActivity extends Activity { private static String SENT = "SMS_SENT"; private static String DELIVERED = "SMS_DELIVERED"; private static int MAX_SMS_MESSAGE_LENGTH = 160; private static Context mContext; private BroadcastReceiver sendBroadcastReceiver, deliveryBroadcastReceiver; private final String DEBUG_TAG = getClass().getSimpleName().toString(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ---when the SMS has been sent--- sendBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS Sent", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show(); break; } } }; // ---when the SMS has been delivered--- deliveryBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS Delivered", Toast.LENGTH_SHORT).show(); break; case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "SMS not delivered",Toast.LENGTH_SHORT).show(); break; } } }; Log.d(DEBUG_TAG, "onCreate() : Register receivers"); registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED)); registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT)); mContext = getApplicationContext(); setContentView(R.layout.main); // ... Bind views and set up onClick listeners ( for example, one to call sendSMS() ) } @Override protected void onDestroy() { // Unregister receivers Log.d(DEBUG_TAG, "onDestroy() : Unregister receivers"); if (sendBroadcastReceiver != null) { unregisterReceiver(sendBroadcastReceiver); sendBroadcastReceiver = null; } if (deliveryBroadcastReceiver != null) { unregisterReceiver(deliveryBroadcastReceiver); deliveryBroadcastReceiver = null; } super.onDestroy(); } // ---sends an SMS message to another device--- public static void sendSMS(String phoneNumber, String message) { Intent sendIntent = new Intent(SENT); sendIntent.putExtra("extra_key", "extra_value")); PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, sendIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0, new Intent(DELIVERED), 0); SmsManager smsManager = SmsManager.getDefault(); int length = message.length(); if (length > MAX_SMS_MESSAGE_LENGTH) { ArrayList < String > messagelist = smsManager.divideMessage(message); smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null); } else smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered); } } //More methods of MainActivity ... } 

Supongo que hay algunos problemas con el registro y anulación del registro en el código. En su lugar, registré los dos BroadcastReceivers en el archivo AndroidManifest.xml y pude pasar exitosamente los extras.

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8" ?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myexample" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_MMS" /> <uses-permission android:name="android.permission.WRITE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:debuggable="true" android:icon="@drawable/ic_launcher_icon" android:label="@string/app_name"> <activity //Main activity... <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity //Activity 2 ... </activity>//More acitivies ... // Send Receiver <receiver android:name="com.sendit.receivers.SendBroadcastReceiver"> <intent-filter> <action android:name="SMS_SENT" /> </intent-filter> </receiver> //Delivery Receiver <receiver android:name="com.sendit.receivers.DeliveryBroadcastReceiver"> <intent-filter> <action android:name="SMS_DELIVERED" /> </intent-filter> </receiver> </application> </manifest> 

SendBroadcastReceiver.java

 public class SendBroadcastReceiver extends BroadcastReceiver { private final String DEBUG_TAG = getClass().getSimpleName().toString(); private static final String ACTION_SMS_SENT = "SMS_SENT"; // When the SMS has been sent public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ACTION_SMS_SENT)) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "SMS Sent", Toast.LENGTH_SHORT).show(); Bundle b = intent.getExtras(); Log.d(DEBUG_TAG, "sendBroadcastReceiver : b is " + b); if (b != null) { String value = b.getString("extra_key"); Log.d(DEBUG_TAG, "sendBroadcastReceiver : value is " + value); } break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT) .show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(context, "No service", Toast.LENGTH_SHORT) .show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show(); break; } } } } 

DeliveryBroadcastReceiver.java

 public class DeliveryBroadcastReceiver extends BroadcastReceiver { private final String DEBUG_TAG = getClass().getSimpleName().toString(); private static final String ACTION_SMS_DELIVERED = "SMS_DELIVERED"; // When the SMS has been delivered public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ACTION_SMS_DELIVERED)) { 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; } } } } 

MainActivity.java

 public class MainActivity extends Activity { private static String ACTION_SMS_SENT = "SMS_SENT"; private static String ACTION_SMS_DELIVERED = "SMS_DELIVERED"; private static int MAX_SMS_MESSAGE_LENGTH = 160; private static Context mContext; private final String DEBUG_TAG = getClass().getSimpleName().toString(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getApplicationContext(); setContentView(R.layout.main); // ... Bind views and set up onClick listeners ( for example, one to call sendSMS() ) } // ---sends an SMS message to another device--- public static void sendSMS(String phoneNumber, String message) { Intent sendIntent = new Intent(ACTION_SMS_SENT); sendIntent.putExtra("extra_key", "extra_value")); PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, sendIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_SMS_DELIVERED), 0); SmsManager smsManager = SmsManager.getDefault(); int length = message.length(); if (length > MAX_SMS_MESSAGE_LENGTH) { ArrayList < String > messagelist = smsManager.divideMessage(message); smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null); } else smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered); } } //More methods of MainActivity ... } 
  • Cómo recuperar la ubicación GPS a través de SMS
  • Enviar SMS a través de la intención de múltiples números de teléfono
  • Cómo acceder a la bandeja de entrada de sms desde javascript en android (phonegap)
  • ¿Necesito anular el registro de 'anonymous' BroadcastReceiver
  • La forma más rápida y rápida de obtener nuevos mensajes sms al iniciar la aplicación - Android
  • Android: detecta SMS saliente, cuenta incorrecta
  • Tarjeta dual sim enviar sms android
  • Mensaje de autocompletado en Phonegap / Cordova iOS y Android
  • ¿Cómo enviar SMS usando Twilio en mi aplicación Android?
  • Envío de SMS a granel con el administrador de sms en android
  • URL de SMS en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.