52
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-01

先日、弊社(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);
}
52
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?