Help us understand the problem. What is going on with this article?

Facebook/Twitterに対応したURLの共有Intentを作成する方法

More than 3 years have passed since last update.

先日、弊社(heathrow, Inc)の自社サービスFAVRICA - あらゆるファッション通販サイトをまとめて検索Android版を無事リリースすることが出来ました。

公開を記念して、開発で得たノウハウなどをまとめて公開しております.
FAVRICA Android版公開記念、いろんなノウハウ公開 - Qiita


よくある、Webページをタイトル+URLで共有したい場合
Facebook/Twitterに対応するには少しだけ工夫が必要になります.

通常のよくあるコード

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, subject + " " + url);
startActivity(intent);

でもこれだと

  • Facebookの場合、EXTRA_TEXTにURL以外が含まれるとだめ
  • Twitterの場合、ハッシュタグつけたいかも
  • もしかしたらLineの場合は、○○したい
  • etc

アプリごと個別に設定できるとうれしい

解決策

いろいろ調べてみるとChooserってのをつかってゴニョゴニョすればいいことがわかった.

でも、いろんな記事ためしてみるとうまくいかないやつが多い

  • 並び順がかわる
  • 表示タイトルが変わる

試行錯誤の上、上記問題点を解決した 決定版 ができたと思うのでこの際、共有しちゃいます.

String textDefault = subject + " " + url;
String textTwitter = subject + " " + url + " #favrica";
String chooserTitle = "共有";

Intent baseIntent = new Intent(Intent.ACTION_SEND);
baseIntent.setType("text/plain");
baseIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
baseIntent.putExtra(Intent.EXTRA_TEXT, textDefault);

PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(baseIntent, PackageManager.MATCH_DEFAULT_ONLY);

if (resolveInfoList.isEmpty()) {
    context.startActivity(Intent.createChooser(baseIntent, chooserTitle));
} else {
    List<LabeledIntent> shareIntentList = new ArrayList<>();
    Collections.sort(resolveInfoList, new ResolveInfo.DisplayNameComparator(context.getPackageManager()));
    for (ResolveInfo resolveInfo : resolveInfoList) {
        Intent shareIntent = new Intent(baseIntent);

        String packageName = resolveInfo.activityInfo.packageName;
        switch (packageName) {
            // Facebook公式アプリの場合
            case "com.facebook.katana":
                shareIntent.putExtra(Intent.EXTRA_TEXT, url);
                break;
            // Twitter公式アプリの場合
            case "com.twitter.android":
                shareIntent.putExtra(Intent.EXTRA_TEXT, textTwitter);
                break;
            // その他Lineなど個別設定あれば追加
        }

        // これがないと一覧表示時のラベルが変になる
        shareIntent.setClassName(packageName, resolveInfo.activityInfo.name);
        shareIntentList.add(
                new LabeledIntent(shareIntent, packageName, resolveInfo.loadLabel(pm), resolveInfo.icon));
    }

    // ここでリストの最後のものをとってこないと、並び順が変になる
    Intent chooserIntent = Intent.createChooser(shareIntentList.remove(shareIntentList.size() - 1), chooserTitle);
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, shareIntentList.toArray(new LabeledIntent[shareIntentList.size()]));
    context.startActivity(chooserIntent);
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした