【问题标题】:How to know which intent is selected in Intent.ACTION_SEND?如何知道 Intent.ACTION_SEND 中选择了哪个意图?
【发布时间】:2011-09-21 07:13:32
【问题描述】:

我想使用 Android Intent.ACTION_SEND 快速分享内容。所以我得到了一个这样的共享列表:

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

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

  • 如果通过 Facebook 分享,内容应为“通过 Facebook 分享”。

那么,有可能吗?

【问题讨论】:

  • 问题出在哪里?您根据单击的项目发送意图?!问题出在哪里
  • 啊,我的意思是我怎么知道选择了哪个Intent来执行分享动作?
  • 太糟糕了,根据stackoverflow.com/questions/6137592/…stackoverflow.com/questions/4417019/…,我找不到用户选择的意图。
  • 天哪!我从来没有用过这样的东西!我以为这是你创造的东西!呵呵,当然你不能......你试试 startActivityForResult 并尝试 onActivityResult 来阅读意图,也许有一些信息......但如果社区说你不能,那么可能这已经被试验过了

标签: android android-intent


【解决方案1】:

您无法获得此类信息。

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

要创建这样的对话框,您需要使用PackageManager 及其queryIntentActivities() 函数。该函数返回List<ResolveInfo>

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

在对话框中的列表中(或在样式为对话框的活动中)显示结果。当一个项目被点击创建新的Intent.ACTION_SEND,添加你想要的内容并添加所选活动的包(intent.setPackage(pkgName))。

【讨论】:

    【解决方案2】:

    没有直接的方法可以访问此类信息....

    第 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();
    

    第 2 步:现在您已经为适配器创建了一个布局充气器 (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
    

    第 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
    

    【讨论】:

    • 我还建议将 alert.show() 更改为被 IF 包围以防止多次点击。 if (!alert.isShowing()) { alert.show(); }
    【解决方案3】:

    不确定您是否仍在寻找答案,但 ClickClickClack 提供了一个示例实现,说明如何拦截 ACTION_SEND 意图并根据包名称和某些特征选择最终发生的情况。 In 涉及 Tomik 提到的大部分步骤。

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

    此实施的一个强大方面是您可以在调用中添加分析。

    【讨论】:

    • 这是一个出色的实现。
    【解决方案4】:

    使用 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()));
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多