Android

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