Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging Intents

I asked a question previously about what shows up in the IntentChooser when I send an Intent with ACTION_SEND and MIME type "image/png". The problem is that some phones come with a default messaging app that is not showing up in the list, mine included (myTouch 4G) as well as a user that I speak with over email (using an HTC EVO). If I choose a Send or Share option from the built in gallery app or another application on the same image I'm saving and attempting to send directly from my app, Messages shows up in the list. From my app it does not. Other phones don't have this problem, so it's clearly a platform specific thing. But that doesn't mean I should just ignore the problem.

So, I go to troubleshooting the issue. I register one of the activities in my app to receive the the same type of intent, and then hit a breakpoint to analyze the Intent object being sent from the two different ways of sending it.

The problem is, the intent I'm sending and the intent being sent from Gallery or AndroZip (where Messages does show up in the chooser) seem to be the same. They both have the same action, same categories, same flags, same mime type. What else can I inspect on the Intent from Gallery or AndroZip to tell if there's some more information I can add to my Intent to get the default messaging app to show up in the chooser in cases where it is not?

like image 929
Rich Avatar asked Dec 12 '10 21:12

Rich


People also ask

What are intents used for?

An intent is to perform an action on the screen. It is mostly used to start activity, send broadcast receiver,start services and send message between two activities. There are two intents available in android as Implicit Intents and Explicit Intents. Here is a sample example to start new activity with old activity.

What is Intent action?

Android Intent is the message that is passed between components such as activities, content providers, broadcast receivers, services etc. It is generally used with startActivity() method to invoke activity, broadcast receivers etc. The dictionary meaning of intent is intention or purpose.


2 Answers

The problem is specific to HTC Sense phones, and it arises because their Gallery and Messaging apps are different to the stock ones.

Specifically the Intent sent from Gallery to Messaging has the action android.intent.action.SEND_MSG which is different to android.intent.action.SEND. The Sense messaging app doesn't handle SEND, unlike the stock messaging app.

So the question becomes, how is the Sense Gallery app creating an activity chooser dialog which combines both SEND and SEND_MSG ?

I've done some research and got mostway there... the code below works, but the "Messages" entry in the dialog appears at the top rather than in alphabetical order as per Gallery. Doubtless some more research into intents would correct that, but at least this works:

    // Create a chooser for things that can ACTION_SEND images
    Intent intent = new Intent(Intent.ACTION_SEND);
    Uri data = Uri.parse("content://media/external/images/media/98");
    intent.putExtra(Intent.EXTRA_STREAM, data);
    intent.setType("image/jpeg");
    Intent chooser = Intent.createChooser(intent, "Blah");

    // Add the stupid HTC-Sense-specific secondary intent
    Intent htcIntent = new Intent("android.intent.action.SEND_MSG");
    htcIntent.putExtra(Intent.EXTRA_STREAM, data);
    htcIntent.setType("image/jpeg");  
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent });

    // Show the chooser
    startActivity(chooser);
like image 70
Reuben Scratton Avatar answered Sep 19 '22 14:09

Reuben Scratton


First of all, +1 to Reuben, he is the genius, not me. But I had to modify his code a bit to get it to work. Basically I had to putExtra() on the htcIntent or the image never got stuck to the Intent.

Tested and validated on a Droid X and HTC Incredible (which had the same problem until now thanks to Reuben).

Uri uri = Uri.fromFile(new File(mFile));  
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png"); 

Intent htcIntent = new Intent("android.intent.action.SEND_MSG");
htcIntent.setType("image/png");
htcIntent.putExtra(Intent.EXTRA_STREAM, uri);

Intent chooser = Intent.createChooser(intent, "Send Method");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent });
startActivity(chooser);

Edit: I realize I'm putting the image on two Intents now, but I couldn't get it to work any other way.

like image 35
user432209 Avatar answered Sep 22 '22 14:09

user432209