Android PendingIntent extras, not received by BroadcastReceiver
Asked Answered
S

2

6

When I pass extras to a PendingIntent, the message is never received by the sendBroadcastReceiver, because the onReceive() method of this BroadcastReceiver is never called. Why is this happening?

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 ... 

}
Sparker answered 28/1, 2013 at 21:28 Comment(1)
thanks for the MAX_SMS_MESSAGE_LENGTH although in my sim its 70 chars but i didn't know about the smsManager.sendMultipartTextMessage optionBunkmate
S
22

I guess there are some issues with registering and unregistering in the code. Instead I registered the two BroadcastReceivers in the AndroidManifest.xml file and was able to successfully pass 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 ... 

}
Sparker answered 30/1, 2013 at 19:36 Comment(3)
getClass().getSimpleName().toString(); !Danieladaniele
toobsco42 : I am doing the same functionality as you did above but i am getting null at intent.getExtras(); your lil help would be appreciated. Thanks.Discontinuity
Check my answer lowerLelahleland
L
0

Anyone who's extras are null in Broadcast Receiver:

You should use FLAG_MUTABLE

Here is an example:

PendingIntent.getBroadcast(
     context,
     0,
     intent,
     PendingIntent.FLAG_MUTABLE //not FLAG_IMMUTABLE
)
Lelahleland answered 4/3, 2023 at 3:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.