xvar
xvar

Reputation: 103

Android. Custom Intent chooser

I wonder, is there any way to choose behavior using Intent.createChooser method? For example, I have an image, which I would like send by e-mail, if it's chosen (first option). And on second option I'd like to send sms with the link on this image (For which I'll need complex actions - upload image to the sever, retrieve download link, which I'd like to be in the sms and paste it to the sms)

Could you possibly come up with any suggestion, what should I do to accomplish the second task?

I believe I can send an e-mail with image with something like this:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.setType("application/image");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{textMail}); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Some Subj"); 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Some Extra Text"); 
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileUri));
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

UPD: I realized, that what I truly needed is to intercept the user click, if the sms was chosen in intent chooser. So, the question is how it might be accomplished?

Upvotes: 7

Views: 23789

Answers (3)

Shachar Silbert
Shachar Silbert

Reputation: 29

In addition to the selected answer.
You could also add a control for Facebook, as Facebook does not work well with the sharer:

if (activity.applicationInfo.packageName.toLowerCase().contains("facebook")) {
                    //Share on Facebook
                    ShareLinkContent content = new ShareLinkContent.Builder().
                            setContentUrl(Uri.parse(mLink)).
                            setImageUrl(Uri.parse(mImageURL)).
                                    setContentTitle(mTitle).
                                    setContentDescription(mDescription)
                            .build();
                    com.facebook.share.widget.ShareDialog.show(mActivity, content);
                } else {
                    //Share on selected application
                    ComponentName name = new ComponentName(activity.applicationInfo.packageName,
                            activity.name);
                    shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                    shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                    shareIntent.setComponent(name);
                    mActivity.startActivity(shareIntent);
                }

Upvotes: 0

user3921740
user3921740

Reputation: 550

1)Create Intent to perform share or send operation,

Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
email.putExtra(Intent.EXTRA_SUBJECT, "Hi");
email.putExtra(Intent.EXTRA_TEXT, "Hi,This is Test");

email.setType("text/plain");

2)Create AlertDialog to set the Application in the alertdialog,

final Dialog dialog = new Dialog(Custom_chooser.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams WMLP = dialog.getWindow().getAttributes();
WMLP.gravity = Gravity.CENTER;
dialog.getWindow().setAttributes(WMLP);
dialog.getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setCanceledOnTouchOutside(true);
dialog.setContentView(R.layout.about_dialog);
dialog.show();

3)Get the list of application related to the particular intent using the ResolveInfo

List<ResolveInfo> launchables=pm.queryIntentActivities(email, 0);
Collections.sort(launchables,newResolveInfo.DisplayNameComparator(pm));

4))Set the list of application to the custom listview.

adapter=new AppAdapter(pm, launchables);
lv.setAdapter(adapter);

5)Finally,lanch the particular application when choose the application from the list of application in listview,

ResolveInfo launchable=adapter.getItem(position);
ActivityInfo activity=launchable.activityInfo;
ComponentName name=new ComponentName(activity.applicationInfo.packageName,
activity.name);
email.addCategory(Intent.CATEGORY_LAUNCHER);
email.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
email.setComponent(name);
startActivity(email);

For more refer this link:http://velmuruganandroidcoding.blogspot.in/2014/01/custom-chooser-android-in-example.html

Upvotes: 10

xvar
xvar

Reputation: 103

It seems to me, that it can't be accomplished exactly as I wanted.

Possible way is to build custom app chooser using queryIntentActivities() in the PackageManager class. Helpful post: Custom filtering of intent chooser based on installed Android package name

Another possible way is to create custom pop-up - http://developer.android.com/guide/topics/ui/menus.html#PopupMenu
or floating context menu -
http://developer.android.com/guide/topics/ui/menus.html#FloatingContextMenu

It appeared to be that what customer actually wanted was only some custom Dialog. Something like this:

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("E-mail / MMS").setItems(R.array.send_array, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            // The 'which' argument contains the index position
            // of the selected item
        }
    });
    return builder.create();
}

Upvotes: 1

Related Questions