Android 如何知道在intent.ACTION\u发送中选择了哪个intent?

Android 如何知道在intent.ACTION\u发送中选择了哪个intent?,android,android-intent,Android,Android Intent,我想使用Android Intent.ACTION\u发送以快速共享某些内容。所以我得到了一个如下的分享列表: 但我想为每个操作共享不同的内容,例如: 如果通过电子邮件/Gmail共享,则内容应为“通过电子邮件共享” 如果通过Facebook共享,则内容应为“通过Facebook共享” 那么,有可能做到这一点吗?您无法获得此类信息 除非您为活动选择创建自己的对话框实现 要创建这样的对话框,您需要使用PackageManager及其queryIntentActivities()函数。函数返回

我想使用Android Intent.ACTION\u发送以快速共享某些内容。所以我得到了一个如下的分享列表:

但我想为每个操作共享不同的内容,例如:

  • 如果通过电子邮件/Gmail共享,则内容应为“通过电子邮件共享”

  • 如果通过Facebook共享,则内容应为“通过Facebook共享”


那么,有可能做到这一点吗?

您无法获得此类信息

除非您为活动选择创建自己的对话框实现

要创建这样的对话框,您需要使用
PackageManager
及其
queryIntentActivities()
函数。函数返回
列表

ResolveInfo
包含有关活动的一些信息(
ResolveInfo.activityInfo.packageName
),在
PackageManager
的帮助下,您可以获得其他信息(用于在对话框中显示活动)-应用程序图标可绘制、应用程序标签等


在对话框(或样式为对话框的活动)的列表中显示结果。单击项目时,请添加所需内容并添加所选活动的包(
Intent.setPackage(pkgName)
)。

不确定是否仍在寻找答案,但是ClickClack有一个示例实现,说明了如何截取操作并根据包名和某些特征选择最终发生的情况。中涉及Tomik提到的大多数步骤


此实现的一个强大方面是,您可以将分析添加到通话中

没有直接的方法来获取此类信息

步骤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();
步骤3:创建xml布局类型以在对话框(social_share.xml)中显示列表视图


//vKj

使用Tomik great Response,我可以使用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()));
        }
    }

}
public类MainActivity扩展了FragmentActivity
{
阵列列表图标;
阵列列表标签;
@凌驾
创建时受保护的void(包arg0){
//TODO自动生成的方法存根
super.onCreate(arg0);
setContentView(R.layout.activity_main);
icons=newarraylist();
标签=新的ArrayList();
PackageManager=getPackageManager();
意向意向=新意向(意向.行动\发送);
intent.setType(“文本/普通”);
列出活动=经理。
查询活动(意向,0);

对于(int i=0;问题出在哪里?你发送的意图取决于点击的项目?!问题出在哪里啊,我的意思是,我怎么知道选择了哪个意图来执行共享操作?太糟糕了,根据和,我找不到用户选择的意图。哦,我的天!我从来没有使用过这样的东西!我以为这是你创造的东西!呵呵,当然是你不能..不如你试着启动TactivityForresult并试着打开ActivityResult来阅读意图,也许有一些信息在那里…但是如果社区说你不能,那么这可能已经被实验过了这是一个很好的实现。我还建议将alert.show()改为用if包围,以防止多次单击。if(!alert.isShowing()){alert.show();}
<?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
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()));
        }
    }

}