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