在Android中分享URL到Facebook、Twitter和电子邮件?

61

有没有类似于getsharekit.com的安卓版本?它允许将URL分享到社交网络网站。是否有类似的东西,还是我需要为Facebook、Twitter和电子邮件分别编写代码?


1
每种情况的更好答案可以在以下问题中找到:FacebookTwitter电子邮件(使用Intent.EXTRA_TEXT在电子邮件正文中包含URL)。 - Jonik
这是我的解决方案,仅适用于在Facebook上分享URL,https://dev59.com/xmsz5IYBdhLWcg3w9ssQ#29529335 - Hesam
7个回答

89

我不确定这是否是您所指的,但您可以使用Android内置的共享菜单...

您可以使用Intents分享URL到Facebook、Twitter、Gmail和更多应用(只要这些应用已安装在您的设备上):

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_SUBJECT, "Sharing URL");
i.putExtra(Intent.EXTRA_TEXT, "http://www.url.com");
startActivity(Intent.createChooser(i, "Share URL"));

如果您想要分享的应用程序未安装在用户的设备上,例如Facebook,那么您将需要使用Facebook SDK。

如果您希望您的Activity还可以处理从其他应用程序共享的文本数据,您可以将以下内容添加到AndroidManifest.xml中:

<activity android:name=".ShareLink">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>
希望这能有所帮助!

1
我正在寻找一种不使用已安装应用程序的解决方案。 - sunil
谢谢,我已经从text/html更改为text/plain,这很好用,另外还添加了意图过滤器部分到活动中。 - Muhannad A.Alhariri
没有必要将其添加到清单中。只使用Java片段就可以正常工作。 - Jarett Millard
2
@Jarett 是的,我知道...那是2010年的事了,我还很年轻 :) 已更新。谢谢。 - Lior Iluz

47

1
现在只需使用androidx https://developer.android.com/reference/androidx/core/app/ShareCompat,但实现方式是相同的。 - mikep

6

4

// 用于URL

Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("text/plain");
share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
share.putExtra(Intent.EXTRA_SUBJECT, "Title Of The Post");
share.putExtra(Intent.EXTRA_TEXT, "http://www.codeofaninja.com");
startActivity(Intent.createChooser(share, "Share link!"));

// 用于图片

Intent share = new Intent(Intent.ACTION_SEND);
// If you want to share a png image only, you can do:
// setType("image/png"); OR for jpeg: setType("image/jpeg");
share.setType("image/*");

// Make sure you put example png image named myImage.png in your
// directory
String imagePath = Environment.getExternalStorageDirectory()
        + "/myImage.png";

File imageFileToShare = new File(imagePath);
Uri uri = Uri.fromFile(imageFileToShare);
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share Image!"));

2

您可以尝试这个...

private void shareTextUrl() {
        Intent share = new Intent(android.content.Intent.ACTION_SEND);
        share.setType("text/plain");
        share.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

        share.putExtra(Intent.EXTRA_SUBJECT, "Title Of The Post");
        share.putExtra(Intent.EXTRA_TEXT, "<source url>");

        startActivity(Intent.createChooser(share, "Share text to..."));
    }

0

这是我的实现,您可以通过添加包名称来添加更多应用程序。此代码还根据应用程序名称对应用程序进行排序。

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

-4

对我来说,这个很好用:

startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND,
    Uri.parse("http://...")),"Share URL"));// share url is on your own

1
无法工作:错误信息“没有应用程序可以执行此操作” - stackflow
1
无法执行此操作的原因是未指定MIME类型。在类型上应用过滤器SEND操作。如果您没有指定它(text/plain),则没有应用程序会拦截该意图。 - Daniele Segato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接