如何针对ACTION_SEND意图过滤特定应用(并为每个应用设置不同的文本)


187

使用ACTION_SEND意图时如何过滤特定的应用程序? 已经以各种方式提出了这个问题,但是我无法根据给出的答案来收集解决方案。希望有人可以提供帮助。我想提供在应用程序内共享的功能。遵循Android Dev Alexander Lucas的建议,我更愿意使用意图而不是使用Facebook / Twitter API。

使用ACTION_SEND意向共享

使用ACTION_SEND意图进行共享非常棒,但是问题是(1)我不想在其中使用每个共享选项,而是将其限制为FB,Twitter和Email,以及(2)我不想共享每个共享应用程序都是一样的。例如,在我的Twitter共享中,我将包含一些提及,并且标签将其限制为140个字符或更少,而Facebook共享中将包含链接和功能图片。

是否可以限制ACTION_SEND(共享)意图的选项?我已经看到了有关使用PackageManager和queryIntentActivities的信息,但是还无法弄清PackageManager和ACTION_SEND意图之间的联系。

要么

如果我可以使用ACTION_SEND意图直接转到Facebook或Twitter,而不是弹出对话框,则可以解决我的问题,而不是过滤共享应用程序。如果是这种情况,那么我可以创建自己的对话框,当他们单击“ Facebook”时,创建一个特定于Facebook的意图,然后将它们一直发送到Facebook。与Twitter相同。

还是不可能?Facebook和Twitter API是唯一的方法吗?


可能重复:[定制过滤-的意图选取器为基础的上安装-机器人-包名] [1] [1]:stackoverflow.com/questions/5734678/...
阿萨夫Pinhassi

1
该博客文章似乎是完美的答案:hkdevtips.blogspot.com/2013/02/…–
Vitali Olshevski

2
嘿朋友...当我单击我的发送按钮,然后打开共享对话框,共享对话框列表是“ gmail,电子邮件,zapiya,转播”等。但不显示facebook,whatsapp,facebook messanger,远足视频群聊...我如何显示它?
GB_Bhayani 1414年

在Android 6.0上只有一项意图操作的项目/选项时,如何不显示选择器?问题不小于6.0的Android上显示
ZYS

Answers:


324

据我所知,StackOverflow有很多人以各种方式问这个问题,但是还没有人完全回答。

我的规范要求用​​户能够选择电子邮件,Twitter,Facebook或SMS,并为每个电子邮件选择自定义文本。这是我实现的方式:

public void onShareClick(View v) {
    Resources resources = getResources();

    Intent emailIntent = new Intent();
    emailIntent.setAction(Intent.ACTION_SEND);
    // Native email client doesn't currently support HTML, but it doesn't hurt to try in case they fix it
    emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_native)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));
    emailIntent.setType("message/rfc822");

    PackageManager pm = getPackageManager();
    Intent sendIntent = new Intent(Intent.ACTION_SEND);     
    sendIntent.setType("text/plain");


    Intent openInChooser = Intent.createChooser(emailIntent, resources.getString(R.string.share_chooser_text));

    List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
    List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();        
    for (int i = 0; i < resInfo.size(); i++) {
        // Extract the label, append it, and repackage it in a LabeledIntent
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;
        if(packageName.contains("android.email")) {
            emailIntent.setPackage(packageName);
        } else if(packageName.contains("twitter") || packageName.contains("facebook") || packageName.contains("mms") || packageName.contains("android.gm")) {
            Intent intent = new Intent();
            intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            if(packageName.contains("twitter")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_twitter));
            } else if(packageName.contains("facebook")) {
                // Warning: Facebook IGNORES our text. They say "These fields are intended for users to express themselves. Pre-filling these fields erodes the authenticity of the user voice."
                // One workaround is to use the Facebook SDK to post, but that doesn't allow the user to choose how they want to share. We can also make a custom landing page, and the link
                // will show the <meta content ="..."> text from that page with our link in Facebook.
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_facebook));
            } else if(packageName.contains("mms")) {
                intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_sms));
            } else if(packageName.contains("android.gm")) { // If Gmail shows up twice, try removing this else-if clause and the reference to "android.gm" above
                intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_gmail)));
                intent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));               
                intent.setType("message/rfc822");
            }

            intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
        }
    }

    // convert intentList to array
    LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]);

    openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    startActivity(openInChooser);       
}

我在很多地方都找到了如何做这件事的方法,但是我在其他任何地方都没有看到所有这些方法。

请注意,此方法还会隐藏我不需要的所有愚蠢选项,例如通过wifi和蓝牙共享。

希望这对某人有帮助。

编辑: 在评论中,有人要求我解释这段代码在做什么。基本上,它只是ACTION_SEND为本机电子邮件客户端创建一个意图,然后将其他意图附加到选择器上。使特定于电子邮件的原始意图摆脱了所有多余的垃圾,例如wifi和蓝牙,然后我从ACTION_SEND纯文本类型的泛型中获取了我想要的其他意图,并在显示选择器之前加以坚持。

当我抓住其他意图时,我为每个意图都设置了自定义文本。

Edit2:自从我发布此消息以来已经有一段时间了,事情发生了一些变化。如果您在选项列表中两次看到gmail,请尝试按照下面@h_k的注释中的建议删除对“ android.gm”的特殊处理。

由于这个答案几乎是我所有stackoverflow信誉点的源头,因此我至少必须尝试使其保持最新状态。


1
我正在使用此代码,但evernote却以某种方式潜入了列表。当我检查软件包名称时,它是com.evernote,所以我不确定为什么会这样。
James Harpe 2013年

1
@ user2249287我建议您逐步执行代码,直到看到被跳过的消息传递应用程序,然后查看程序包名称以确定需要添加哪些字符串以将该应用程序列入白名单。
dacoinminster 2014年

1
@Gilbou嗨!抱歉-自从我看这段代码已经很长时间了。。。记得我说过,setPackage命令选择将其他所有内容附加到的单一意图。要包括或排除其他各种意图,建议您逐步浏览代码,并查看程序包名称。
dacoinminster 2014年

2
要仅过滤用户拥有的电子邮件应用程序,可以使用此问题的第二个答案:stackoverflow.com/questions/8701634/send-email-intent。它不需要使用message / rfc822数据类型,其他应用程序(在这种情况下,例如EverNote)也要使用。
mpellegr,2014年

2
@dacoinminster您的代码非常棒,可以让我为Twitter和Whatsapp等应用定义不同的文本。要删除重复的gmail,我只是从等式中删除了“ android.gm”。我仍然在选择器列表中得到gmail和内置的邮件应用程序,并且主题和文本仍保持不变。
h_k 2015年

26

如果您想要自定义选项,则不应依赖android提供的默认对话框来执行此操作。

相反,您需要做的是自己开发。您将需要查询PackageManager,其中哪些软件包可以处理所需的操作,然后根据答复应用过滤和自定义文本。

具体而言,看看该方法queryIntentActivities所述的PackageManager类。您构建了将启动默认对话框的意图(ACTION_SEND意图),并将其传递给此方法,您将收到一个对象列表,其中包含可处理该意图的活动信息。使用它,您可以选择所需的。

构建要呈现的软件包列表之后,需要构建自己的列表对话框(最好是具有对话框主题的活动),该对话框将显示该列表。

不过要注意的一件事是,很难使自定义对话框看起来像默认对话框。问题在于该对话框中使用的主题是内部主题,您的应用程序无法使用。您可以根据需要尝试使其与本机相似,也可以进行完全自定义的外观(许多应用程序都像图库应用程序那样)


1
将这个问题标记为正确,因为即使我最终选择了不同的路线(请参阅我的回答),它也可以最紧密地回答原始问题。谢谢。
凯尔·克莱格

22

尝试仅共享三个应用程序(Facebook,Twitter,KakaoStory)的此应用程序。

public void onShareClick(View v){
    List<Intent> targetShareIntents=new ArrayList<Intent>();
    Intent shareIntent=new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    List<ResolveInfo> resInfos=getPackageManager().queryIntentActivities(shareIntent, 0);
    if(!resInfos.isEmpty()){
        System.out.println("Have package");
        for(ResolveInfo resInfo : resInfos){
            String packageName=resInfo.activityInfo.packageName;
            Log.i("Package Name", packageName);
            if(packageName.contains("com.twitter.android") || packageName.contains("com.facebook.katana") || packageName.contains("com.kakao.story")){
                Intent intent=new Intent();
                intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "Text");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                intent.setPackage(packageName);
                targetShareIntents.add(intent);
            }
        }
        if(!targetShareIntents.isEmpty()){
            System.out.println("Have Intent");
            Intent chooserIntent=Intent.createChooser(targetShareIntents.remove(0), "Choose app to share");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }else{
            System.out.println("Do not Have Intent");
            showDialaog(this);
        }
    }
}

如果您尝试与特定的应用程序共享,此代码将非常有效
Orcun Sevsay 2015年

22

找到了一个适合我的解决方案,请看此处(请参阅第一个答案的第三条评论)。这段代码寻找有效的Twitter客户端,并使用它发布推文。注意:它不会给您各种Twitter客户端的意图,而是让您选择。

使用Twitter分享:

Intent shareIntent = findTwitterClient(); 
shareIntent.putExtra(Intent.EXTRA_TEXT, "test");
startActivity(Intent.createChooser(shareIntent, "Share"));

调用此方法:

public Intent findTwitterClient() {
    final String[] twitterApps = {
            // package // name - nb installs (thousands)
            "com.twitter.android", // official - 10 000
            "com.twidroid", // twidroid - 5 000
            "com.handmark.tweetcaster", // Tweecaster - 5 000
            "com.thedeck.android" }; // TweetDeck - 5 000 };
    Intent tweetIntent = new Intent();
    tweetIntent.setType("text/plain");
    final PackageManager packageManager = getPackageManager();
    List<ResolveInfo> list = packageManager.queryIntentActivities(
            tweetIntent, PackageManager.MATCH_DEFAULT_ONLY);

    for (int i = 0; i < twitterApps.length; i++) {
        for (ResolveInfo resolveInfo : list) {
            String p = resolveInfo.activityInfo.packageName;
            if (p != null && p.startsWith(twitterApps[i])) {
                tweetIntent.setPackage(p);
                return tweetIntent;
            }
        }
    }

    return null;
}

尽管您仍无法设置消息文本(2011年7月弃用),但Facebook会使用“ com.facebook.katana ” 类似。

代码源: 打算在Android上打开Twitter客户端


4
我不喜欢这个答案,因为它依赖于了解所有Twitter应用程序的软件包名称。另一种方式看stackoverflow.com/questions/6827407/...
埃德伯内特

我同意您的看法,尽管您链接的答案也有类似的问题。我从不喜欢依赖字符串比较,尤其是当我无法控制或保证字符串不会更改时。
凯尔·克莱格

11

感谢@dacoinminster。我对他的答案做了一些修改,包括流行应用程序的程序包名称以及这些应用程序的排序。

List<Intent> targetShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> resInfos = pm.queryIntentActivities(shareIntent, 0);
if (!resInfos.isEmpty()) {
    System.out.println("Have package");
    for (ResolveInfo resInfo : resInfos) {
        String packageName = resInfo.activityInfo.packageName;
        Log.i("Package Name", packageName);

        if (packageName.contains("com.twitter.android") || packageName.contains("com.facebook.katana")
                || packageName.contains("com.whatsapp") || packageName.contains("com.google.android.apps.plus")
                || packageName.contains("com.google.android.talk") || packageName.contains("com.slack")
                || packageName.contains("com.google.android.gm") || packageName.contains("com.facebook.orca")
                || packageName.contains("com.yahoo.mobile") || packageName.contains("com.skype.raider")
                || packageName.contains("com.android.mms")|| packageName.contains("com.linkedin.android")
                || packageName.contains("com.google.android.apps.messaging")) {
            Intent intent = new Intent();

            intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
            intent.putExtra("AppName", resInfo.loadLabel(pm).toString());
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT, "https://website.com/");
            intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_text));
            intent.setPackage(packageName);
            targetShareIntents.add(intent);
        }
    }
    if (!targetShareIntents.isEmpty()) {
        Collections.sort(targetShareIntents, new Comparator<Intent>() {
            @Override
            public int compare(Intent o1, Intent o2) {
                return o1.getStringExtra("AppName").compareTo(o2.getStringExtra("AppName"));
            }
        });
        Intent chooserIntent = Intent.createChooser(targetShareIntents.remove(0), "Select app to share");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
        startActivity(chooserIntent);
    } else {
        Toast.makeText(getActivity(), "No app to share.", Toast.LENGTH_LONG).show();
    }
}

9

您可以尝试下面的代码,它可以完美运行。

在这里,我们共享给一些特定的应用程序,例如Facebook,Messenger,Twitter,Google Plus和Gmail。

public void shareIntentSpecificApps() {
        List<Intent> intentShareList = new ArrayList<Intent>();
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(shareIntent, 0);

        for (ResolveInfo resInfo : resolveInfoList) {
            String packageName = resInfo.activityInfo.packageName;
            String name = resInfo.activityInfo.name;
            Log.d(TAG, "Package Name : " + packageName);
            Log.d(TAG, "Name : " + name);

            if (packageName.contains("com.facebook") ||
                    packageName.contains("com.twitter.android") ||
                    packageName.contains("com.google.android.apps.plus") ||
                    packageName.contains("com.google.android.gm")) {

                if (name.contains("com.twitter.android.DMActivity")) {
                    continue;
                }

                Intent intent = new Intent();
                intent.setComponent(new ComponentName(packageName, name));
                intent.setAction(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject");
                intent.putExtra(Intent.EXTRA_TEXT, "Your Content");
                intentShareList.add(intent);
            }
        }

        if (intentShareList.isEmpty()) {
            Toast.makeText(MainActivity.this, "No apps to share !", Toast.LENGTH_SHORT).show();
        } else {
            Intent chooserIntent = Intent.createChooser(intentShareList.remove(0), "Share via");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentShareList.toArray(new Parcelable[]{}));
            startActivity(chooserIntent);
        }
    }

“ if(name.contains(” com.twitter.android.DMActivity“)){继续;}的原因是什么?
isJulian00

8

此解决方案在类似于选择器的ListView对话框中显示了一个应用程序列表:

屏幕截图

由您决定:

  1. 获取相关应用程序包的列表
  2. 给定一个包名,调用相关意图

适配器类:

import java.util.List;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ChooserArrayAdapter extends ArrayAdapter<String> {
    PackageManager mPm;
    int mTextViewResourceId;
    List<String> mPackages;

    public ChooserArrayAdapter(Context context, int resource, int textViewResourceId, List<String> packages) {
        super(context, resource, textViewResourceId, packages);
        mPm = context.getPackageManager();
        mTextViewResourceId = textViewResourceId;
        mPackages = packages;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String pkg = mPackages.get(position);
        View view = super.getView(position, convertView, parent);

        try {
            ApplicationInfo ai = mPm.getApplicationInfo(pkg, 0);

            CharSequence appName = mPm.getApplicationLabel(ai);
            Drawable appIcon = mPm.getApplicationIcon(pkg);

            TextView textView = (TextView) view.findViewById(mTextViewResourceId);
            textView.setText(appName);
            textView.setCompoundDrawablesWithIntrinsicBounds(appIcon, null, null, null);
            textView.setCompoundDrawablePadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getContext().getResources().getDisplayMetrics()));
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        return view;
    }

}

及其用法:

    void doXxxButton() {
        final List<String> packages = ...;
        if (packages.size() > 1) {
            ArrayAdapter<String> adapter = new ChooserArrayAdapter(MyActivity.this, android.R.layout.select_dialog_item, android.R.id.text1, packages);

            new AlertDialog.Builder(MyActivity.this)
            .setTitle(R.string.app_list_title)
            .setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item ) {
                    invokeApplication(packages.get(item));
                }
            })
            .show();
        } else if (packages.size() == 1) {
            invokeApplication(packages.get(0));
        }
    }

    void invokeApplication(String packageName) {
        // given a package name, create an intent and fill it with data
        ...
        startActivityForResult(intent, rq);
    }

4

最干净的方法是复制以下类:ShareActionProvider,ActivityChooserView,ActivityChooserModel。添加功能以过滤ActivityChooserModel中的意图,并在ShareActionProvider中提供适当的支持方法。我创建了必要的类,您可以将它们复制到项目中(https://gist.github.com/saulpower/10557956)。这不仅增加了过滤想要共享的应用程序的能力(如果您知道程序包名称),而且还关闭了历史记录。

private final String[] INTENT_FILTER = new String[] {
    "com.twitter.android",
    "com.facebook.katana"
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.journal_entry_menu, menu);

    // Set up ShareActionProvider's default share intent
    MenuItem shareItem = menu.findItem(R.id.action_share);

    if (shareItem instanceof SupportMenuItem) {
        mShareActionProvider = new ShareActionProvider(this);
        mShareActionProvider.setShareIntent(ShareUtils.share(mJournalEntry));
        mShareActionProvider.setIntentFilter(Arrays.asList(INTENT_FILTER));
        mShareActionProvider.setShowHistory(false);
        ((SupportMenuItem) shareItem).setSupportActionProvider(mShareActionProvider);
    }

    return super.onCreateOptionsMenu(menu);
}

如何添加包含剩余应用程序的google +和其他选项
Sunishtha Singh 2015年

3

我已经改善了@dacoinminster的答案,这是共享您的应用程序的示例结果:

// Intents with SEND action
PackageManager packageManager = context.getPackageManager();
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(sendIntent, 0);

List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
Resources resources = context.getResources();

for (int j = 0; j < resolveInfoList.size(); j++) {
    ResolveInfo resolveInfo = resolveInfoList.get(j);
    String packageName = resolveInfo.activityInfo.packageName;
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setComponent(new ComponentName(packageName,
    resolveInfo.activityInfo.name));
    intent.setType("text/plain");

    if (packageName.contains("twitter")) {
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.twitter) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    } else {
        // skip android mail and gmail to avoid adding to the list twice
        if (packageName.contains("android.email") || packageName.contains("android.gm")) {
            continue;
        }
        intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForFacebookWhatsapp) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    }

    intentList.add(new LabeledIntent(intent, packageName, resolveInfo.loadLabel(packageManager), resolveInfo.icon));
}

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.subjectForMailApps));
emailIntent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.largeTextForMailApps) + "https://play.google.com/store/apps/details?id=" + context.getPackageName());

context.startActivity(Intent.createChooser(emailIntent, resources.getString(R.string.compartirEn)).putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new LabeledIntent[intentList.size()])));

3

我遇到了同样的问题,这个公认的解决方案并没有帮助我,如果有人遇到同样的问题,则可以使用我的代码段:

// example of filtering and sharing multiple images with texts
// remove facebook from sharing intents
private void shareFilter(){

    String share = getShareTexts();
    ArrayList<Uri> uris = getImageUris();

    List<Intent> targets = new ArrayList<>();
    Intent template = new Intent(Intent.ACTION_SEND_MULTIPLE);
    template.setType("image/*");
    List<ResolveInfo> candidates = getActivity().getPackageManager().
            queryIntentActivities(template, 0);

    // remove facebook which has a broken share intent
    for (ResolveInfo candidate : candidates) {
        String packageName = candidate.activityInfo.packageName;
        if (!packageName.equals("com.facebook.katana")) {
            Intent target = new Intent(Intent.ACTION_SEND_MULTIPLE);
            target.setType("image/*");
            target.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
            target.putExtra(Intent.EXTRA_TEXT, share);
            target.setPackage(packageName);
            targets.add(target);
        }
    }
    Intent chooser = Intent.createChooser(targets.remove(0), "Share Via");
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targets.toArray(new Parcelable[targets.size()]));
    startActivity(chooser);

}

3
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, 
    Uri.fromParts("mailto", "android@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, text);
startActivity(Intent.createChooser(emailIntent, "Send email..."));

0

如此简洁明了。感谢开源开发人员cketti分享了此解决方案:

String mailto = "mailto:bob@example.org" +
    "?cc=" + "alice@example.com" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
  startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
  //TODO: Handle case where no email app is available
}

是链接到他/她的要点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.