【问题标题】:How to customize share intent in Android?如何在 Android 中自定义分享意图?
【发布时间】:2011-10-13 05:36:24
【问题描述】:

现在我可以使用分享意图打开分享对话框

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, link);  
    startActivity(Intent.createChooser(intent, "Share with"));

但我需要对话框不要出现并直接分享到一个社交网络,例如(FB 或 twitter)

有什么建议吗?

【问题讨论】:

  • 那你为什么不直接使用 Facebook SDK 实现 FB 状态更新或使用 Twitter API 实现 twitter 状态更新?
  • 我只想在 FB 或 twitter 上分享链接,我是否必须创建 FB 应用程序并使用它的关键是我可以直接分享链接?

标签: android share


【解决方案1】:

不,你不能。意图应该以这种方式工作。如果您必须强制打开特定应用程序,请在目标应用程序支持的情况下使用显式意图。如果不知道目标应用程序的包名称或组件名称,或者数据的类型或 MIME 类型,您就无法强制特定应用程序使用通用意图。

【讨论】:

  • 你的意思是,例如,对于 facebook,我必须使用 Facebook sdk 并创建 facebook 应用程序并将我的 android 应用程序链接到它以便制作墙贴?
  • 是的,完全正确。我不知道官方的 facebook 应用程序是否公开了任何现成的意图供您使用。推特客户端之一有这个,但我不记得现在是哪个。我猜,(Twidroid)。
  • 如果我不使用已安装的应用程序.. 我可以在FB页面上打开浏览器并直接发布链接吗?
  • 您必须检查它是否正常工作。我不确定。
  • 但是,根据我的观察,我认为这是可能的? stackoverflow.com/questions/19478888/…(我不知道该怎么做)
【解决方案2】:

有一种方法可以直接打开你想要的intent。您可以获取意图列表并仅打开一个。

查看此代码:

private void initShareIntent(String type) {
    boolean found = false;
    Intent share = new Intent(android.content.Intent.ACTION_SEND);
    share.setType("image/jpeg");

    // gets the list of intents that can be loaded.
    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
    if (!resInfo.isEmpty()){
        for (ResolveInfo info : resInfo) {
            if (info.activityInfo.packageName.toLowerCase().contains(type) || 
                    info.activityInfo.name.toLowerCase().contains(type) ) {
                share.putExtra(Intent.EXTRA_SUBJECT,  "subject");
                share.putExtra(Intent.EXTRA_TEXT,     "your text");
                share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(myPath)) ); // Optional, just if you wanna share an image.
                share.setPackage(info.activityInfo.packageName);
                found = true;
                break;
            }
        }
        if (!found)
            return;

        startActivity(Intent.createChooser(share, "Select"));
    }
}

如果你想打开推特,就这样做:

initShareIntent("twi");

如果脸书:

initShareIntent("face");

如果是邮件:

initShareIntent("mail"); // or "gmail"

如果您想显示与类型匹配的意图列表,使用第一个马赫数,请参阅这篇文章:Android Intent for Twitter application

【讨论】:

  • @Derzu 如果我想打开 Google+ 和电子邮件(不是 gmail 即邮件客户端,我可以从该客户端向 yahoo、hotmail 等发送邮件)
  • @Anshuman 我不确定我是否理解你的问题。如果您想要求用户选择电子邮件应用程序,请在这篇文章中解释:stackoverflow.com/questions/2077008/…
  • @SudiptaforAndroid 您是否安装了 facebook 应用程序? facebook 应用意图不接受 EXTRA_TEXT 参数,也不接受 EXTRA_SUBJECT。但是会附加图像。
  • 是的..我已经安装了 FB。我可以将任何 url 分享到 FB,但它不分享纯文本......你能帮忙..
  • @SudiptaforAndroid 这是官方 facebook 应用程序中的一个已知错误。您可以通过不使用 Intent 来解决此问题,使用 de facebooksdk。请参阅以下链接:stackoverflow.com/questions/8771333/…stackoverflow.com/questions/3481079/android-facebook-intent
【解决方案3】:

首先,列出所有要共享的应用。

private java.util.List<ResolveInfo> showAllShareApp() {
    java.util.List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
    Intent intent = new Intent(Intent.ACTION_SEND, null);
    intent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    intent.setType("text/plain");
    PackageManager pManager = getPackageManager();
    mApps = pManager.queryIntentActivities(intent,
            PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
    return mApps;
}

然后,选择一个

    private void share(ResolveInfo appInfo) {
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
        if (appInfo != null) {
            sendIntent
                    .setComponent(new ComponentName(
                            appInfo.activityInfo.packageName,
                            appInfo.activityInfo.name));
        }
        sendIntent.setType("text/plain");
//        startActivity(Intent.createChooser(sendIntent, "Share"));
        startActivity(sendIntent);
    }

Here's an sample project.希望对您有所帮助。

【讨论】:

    【解决方案4】:

    您可以使用 ACTION_SENDTO 获取所有电子邮件客户端,例如

            Intent getMailClients = new Intent(Intent.ACTION_SENDTO);
            getMailClients.setData(Uri.parse("mailto:"));
            final PackageManager pm = this.getPackageManager();
            final List<ResolveInfo> emailsClients = pm.queryIntentActivities(getMailClients, 0);
    
            if (emailsClients.size() == 0) {
                Toast.makeText(this, "There are no email clients installed", Toast.LENGTH_LONG).show();
                return;
            }
    

    然后创建您自己的选择器(包含已创建应用程序列表的对话框)。当用户单击项目时,您可以这样做。

            Intent sendMailIntent = new Intent(Intent.ACTION_SEND);
            sendMailIntent.setType(some type like text/plain or other you need);
            ...
            there you can set SUBJECT,EMAILTO, attach files
            ...
            final List<ResolveInfo> matches = pm.queryIntentActivities(sendMailIntent, 0);
            ResolveInfo sendingProgramm = null;
            for (final ResolveInfo info : matches) {
                if (info.activityInfo.packageName.equals(clickedResolveInfo.activityInfo.packageName)) {
                    sendingProgramm = info;
                    sendMailIntent
                            .setClassName(sendingProgramm.activityInfo.packageName, sendingProgramm.activityInfo.name);
                    break;
                }
            }
            startActivity(sendMailIntent);
    

    也许对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多