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 ... }
- Cuando envío SMS, a veces código de resultado = 0. ¿Qué significa ese código?
- Android enviar SMS que es visible en el hilo de SMS (sin GUI)
- Cómo obtener todos los mensajes de ThreadID en android
- ACTION_SEND utilizado para enviar sms
- Cualquier SMS API está disponible para Android para enviar SMS desde Android Application?
- Envío y recepción de texto mediante el emulador de Android
- Adb emu comando no funciona a veces
- Obtener múltiples transmisiones de intenciones?
- Extraer (analizar) la cantidad y descripción de BIZ (Transaction) sms
- Detección de SMS entrantes y salientes
- Android: apertura de la actividad de SMS con múltiples destinatarios especificados
- Envío de SMS mediante programación a varias personas obteniendo un error genérico
- Enviar un mensaje SMS (UTF-16) con un carácter desconocido reemplazado por un "carácter de reemplazo" en Android
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 ... }
- Reaccionar-nativo run-android desajuste versión versión del servidor adb
- La ejecución de android studio falló para la excepción de proceso de tarea para idk-1.8