How to know which intent is selected in Intent.ACTION_SEND?

后端 未结 4 1710
醉酒成梦
醉酒成梦 2020-11-29 05:37

I want to use Android Intent.ACTION_SEND for quickly sharing something. So I got a sharing list like this: \"Sharing

相关标签:
4条回答
  • 2020-11-29 05:58

    Not sure if you are still looking for an answer, but ClickClickClack has an example implementation of how you can intercept the ACTION_SEND intent and choose based off package name and certain characteristics what ends up happening. In involves most of the steps mentioned by Tomik.

    http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/

    One powerful aspect about this implementation is you can add analytics to your calls.

    0 讨论(0)
  • 2020-11-29 06:05

    You can't get such information.

    Unless you create your own implementation of the dialog for the activity selection.

    To create such dialog you need to use PackageManager and its queryIntentActivities() function. The function returns List<ResolveInfo>.

    ResolveInfo contains some information about an activity (resolveInfo.activityInfo.packageName), and with the help of PackageManager you can get other information (useful for displaying the activity in the dialog) - application icon drawable, application label, ... .

    Display the results in a list in a dialog (or in an activity styled as a dialog). When an item is clicked create new Intent.ACTION_SEND, add the content you want and add the package of the selected activity (intent.setPackage(pkgName)).

    0 讨论(0)
  • 2020-11-29 06:08

    Using Tomik great Answer i'm able to produce my own Custom share List using PackageManager loadLabel and LoadIcon:

    public class MainActivity extends FragmentActivity
    {
    
        ArrayList<Drawable> icons;
        ArrayList<String> labels;
    
        @Override
        protected void onCreate(Bundle arg0) {
            // TODO Auto-generated method stub
            super.onCreate(arg0);
            setContentView(R.layout.activity_main);
            icons=new ArrayList<Drawable>();
            labels=new ArrayList<String>();
            PackageManager manager=getPackageManager();
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            List<ResolveInfo> activities=manager.
                    queryIntentActivities(intent,0);
            for(int i=0;i<activities.size();i++)
            {
                ApplicationInfo appInfo=null;
                try {
                    appInfo=manager.getApplicationInfo(activities.get(i).activityInfo.packageName,0);
                    labels.add(name=appInfo.loadLabel(getPackageManager()).toString()); 
                } catch (NameNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                icons.add(appInfo.loadIcon(getPackageManager()));
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-29 06:09

    There is not direct method to access such kind of information....

    Step 1: Inside your code first of all you need to declare an adapter which will contain your custom view of list to be shared on...

    //sharing implementation
                        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    
                        // what type of data needs to be send by sharing
                        sharingIntent.setType("text/plain");
    
                        // package names
                        PackageManager pm = getPackageManager();
    
                        // list package
                        List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
    
                        objShareIntentListAdapter = new ShareIntentListAdapter(CouponView.this,activityList.toArray());
    
                        // Create alert dialog box
                        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                        builder.setTitle("Share via");
                        builder.setAdapter(objShareIntentListAdapter, new DialogInterface.OnClickListener() {
    
                            public void onClick(DialogInterface dialog, int item) {
    
                                ResolveInfo info = (ResolveInfo) objShareIntentListAdapter.getItem(item);
    
                                // if email shared by user
                                if(info.activityInfo.packageName.contains("Email") 
                                        || info.activityInfo.packageName.contains("Gmail")
                                        || info.activityInfo.packageName.contains("Y! Mail")) {
    
                                    PullShare.makeRequestEmail(COUPONID,CouponType);
                                }
    
                                // start respective activity
                                Intent intent = new Intent(android.content.Intent.ACTION_SEND);
                                intent.setClassName(info.activityInfo.packageName, info.activityInfo.name);
                                intent.setType("text/plain");
                                intent.putExtra(android.content.Intent.EXTRA_SUBJECT,  ShortDesc+" from "+BusinessName);
                                intent.putExtra(android.content.Intent.EXTRA_TEXT, ShortDesc+" "+shortURL);
                                intent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+shortURL);                                                            
                                ((Activity)context).startActivity(intent);                                              
    
                            }// end onClick
                        });
    
                        AlertDialog alert = builder.create();
                        alert.show();
    

    Step 2: Now you have create a layout inflater for your adapter(ShareIntentListAdapter.java)

    package com.android;
    
    import android.app.Activity;
    import android.content.pm.ResolveInfo;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class ShareIntentListAdapter extends ArrayAdapter{
    
        private final Activity context; 
        Object[] items;
    
    
        public ShareIntentListAdapter(Activity context,Object[] items) {
    
            super(context, R.layout.social_share, items);
            this.context = context;
            this.items = items;
    
        }// end HomeListViewPrototype
    
        @Override
        public View getView(int position, View view, ViewGroup parent) {
    
            LayoutInflater inflater = context.getLayoutInflater();
    
            View rowView = inflater.inflate(R.layout.social_share, null, true);
    
            // set share name
            TextView shareName = (TextView) rowView.findViewById(R.id.shareName);
    
            // Set share image
            ImageView imageShare = (ImageView) rowView.findViewById(R.id.shareImage);
    
            // set native name of App to share
            shareName.setText(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadLabel(context.getPackageManager()).toString());
    
            // share native image of the App to share
            imageShare.setImageDrawable(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadIcon(context.getPackageManager()));
    
            return rowView;
        }// end getView
    
    }// end main onCreate
    

    Step 3: Create your xml layout type to show list view in dialog box(social_share.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/categoryCell"
        android:layout_width="match_parent"
        android:layout_height="30dip"
        android:background="@android:color/white" >
    
        <TextView
            android:id="@+id/shareName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginBottom="15dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="15dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#000000"
            android:textStyle="bold" />
    
        <ImageView
            android:id="@+id/shareImage"
            android:layout_width="35dip"
            android:layout_height="35dip"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:contentDescription="@string/image_view" />
    
    </RelativeLayout>
    
    // vKj
    
    0 讨论(0)
提交回复
热议问题