startActivityForResult and Intents Extras, it seems extras are not pushed back

Pentium10 picture Pentium10 · May 18, 2010 · Viewed 10k times · Source

I have this code:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setData(ContactsContract.Contacts.CONTENT_URI);
        intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
        startActivityForResult(intent, PICK_CONTACT);

Then on response:

public void onActivityResult(int reqCode, int resultCode, Intent data) {


        switch (reqCode) {
            case (PICK_CONTACT):
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        Uri contactData = data.getData();
                        String onlineid = data.getStringExtra(EXTRA_ONLINE_ID);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        super.onActivityResult(reqCode, resultCode, data);
    }

the onlineid variable is null. How can I pass a value and then to receive it back?

EDIT

I even tried,

Bundle extras = data.getExtras(); // returns null

Answer

Ja͢ck picture Ja͢ck · Apr 18, 2013

This is done by design; system activities will not send back the extras with which they're called, so you have to manage the data elsewhere.

Luckily, the resultCode parameter is fully controlled by yourself, which means that you can use it to index your data.

private final int PICK_CONTACT = 0;
private Bundle[] myDataTransfer = { null };

...

Bundle myData = new Bundle();
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag());
myDataTransfer[PICK_CONTACT] = myData;
// create intent and all
startActivityForResult(intent, PICK_CONTACT);

...

public void onActivityResult(int reqCode, int resultCode, Intent data) {
    if (resultCode == PICK_CONTACT) {
        Bundle myData = myDataTransfer[resultCode];
        String onlineid = myData.getString(EXTRA_ONLINE_ID);
    }
}

I'm not a Java programmer, there must be a nicer way to implement a map of Bundles, but this works :)