简体   繁体   English

如何知道在Intent.ACTION_SEND中选择了哪个意图?

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

I want to use Android Intent.ACTION_SEND for quickly sharing something. 我想使用Android Intent.ACTION_SEND快速分享内容。 So I got a sharing list like this: 所以我有一个像这样的共享列表: 分享意图清单

But I want to share different content for each action, such as: 但我希望为每个操作分享不同的内容,例如:

  • If sharing by Email/Gmail, content should be "Share by email". 如果通过电子邮件/ Gmail共享,内容应为“通过电子邮件分享”。

  • If sharing by Facebook, content should be "Share by Facebook". 如果通过Facebook分享,内容应该是“通过Facebook分享”。

So, is it possible to do that? 那么,有可能这样做吗?

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. 要创建此类对话框,您需要使用PackageManager及其queryIntentActivities()函数。 The function returns List<ResolveInfo> . 该函数返回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, ... . ResolveInfo包含有关活动的一些信息( resolveInfo.activityInfo.packageName ),在PackageManager的帮助下,您可以获得其他信息(对于在对话框中显示活动很有用) - 应用程序图标drawable,应用程序标签,.......

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) ). 单击某个项目时,创建新的Intent.ACTION_SEND,添加所需的内容并添加所选活动的包( intent.setPackage(pkgName) )。

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... 第1步:首先在代码内部,您需要声明一个适配器,该适配器将包含要在...上共享的列表的自定义视图...

//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) 第2步:现在您已为适配器创建布局inflater(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) 第3步:创建xml布局类型以在对话框中显示列表视图(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

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. 不确定您是否仍在寻找答案,但ClickClickClack有一个示例实现,您可以如何拦截ACTION_SEND意图并根据包名称和某些特征选择最终发生的事情。 In involves most of the steps mentioned by Tomik. 涉及Tomik提到的大多数步骤。

http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/ 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. 关于此实现的一个强大方面是您可以为您的调用添加分析。

Using Tomik great Answer i'm able to produce my own Custom share List using PackageManager loadLabel and LoadIcon: 使用Tomik很好答案我可以使用PackageManager loadLabel和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()));
        }
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM