Twitter,Facebook,LINEの各SNSに、それぞれのSDKやAPIなどを使用せずに投稿する手段のまとめ。
使うのは主に以下の手段です。
・暗黙的Intent(ACTION_VIEW) + URLスキーマ(Twitter公式、LINE)
・暗黙的Intent(ACTION_SEND) + ExtraDatas(Twitter, Facebook)
#1 公式Twitterアプリへのテキスト投稿
テキストのみ投稿する場合は、Twitterの公式URLスキーマが使えます。
messsage文字列は、URLエンコードが必要です。(特にハッシュタグ#付きにする場合)
Intent intent = new Intent(Intent.ACTION_VIEW);
String messsage= Uri.encode("テスト #コメント");
intent.setData(Uri.parse("twitter://post?message=" + messsage));
startActivity(intent);
ただしこの手法は、現在のところ、公式アプリしか起動出来ません。
(上記URLスキーマに対応するアプリがあれば、自動的にアプリ選択画面になるかと思われます)
また、URLスキーマで画像を投稿する手段はありません。
#2 Twitterクライアントへのテキスト及び画像投稿
公式以外のTwitterクライアントにも投稿したい場合や、画像を投稿したい場合は、通常の暗黙的Intentで行います。
String message="テスト #コメント";
String imagePath="任意の画像パス";
ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this);
// データをセットする
builder.setChooserTitle("Choose App");
builder.setText(message)
if(imagePath!=null){
builder.setType("image/png")
builder.addStream(Uri streamUri)
}else{
builder.setType("text/plain")
}
// アプリ選択画面を起動
builder.startChooser();
注意する点としては、画像のpathは、対象のアプリが読み込める場所になければなりません。つまり、アプリのローカルフォルダなどではダメで、DownloadフォルダやSDカードフォルダ、コンテンツプロバイダのUriなどを渡す必要があります。
また、これだけだと、ACTION_SENDで"text/plain"または"image/*"などに反応するアプリはすべてリストに上がってしまいます。
Twitter関連のアプリに限りたい場合は、Intent.createChooserにEXTRA_INITIAL_INTENTSを指定して選択画面を出すか、独自にフィルタしてアプリ選択画面を自前で表示する必要があります。
尚、Inent.createChooserの方法だと、手持ちの端末ではなぜか"image/png"のときに公式Twitterアプリが出てこないなどしたので、私は自前で選択画面を表示することにしました。
createChooserでやる方法は、こちらが参考になるかと思います。
TwitterやFacebookに投稿する方法
すべてのTwitterクライアントを網羅するのは難しいですが、例えば上記ページのメソッドのキーワードを、Listで渡せるようにして、メジャークライアントのパッケージ名(の一部)を入れてやれば実用的な絞り込みリストにはなると思います(マイナーなクライアントを使っているユーザーから「選べない!」とクレームが来る可能性はありますが)
#3 Fackbookへリンクを投稿する
Facebookへは、暗黙的Intentの方法ではリンクしか投稿出来ません。
メッセージや画像を投稿したい場合は、素直にSDKを導入して下さい。
こちら(TwitterやFacebookに投稿する方法)で紹介したページのメソッドを使うならば、"facebook"をキーワードに入れてあげれば簡単です。
なお、それだとメッセンジャーアプリも候補に入ってしまうので、避けたい場合は、キーワードを"facebook.katana"にしてあげればOK。(メッセンジャーアプリは別アプリなのでfacebook.以下が異なる)
#4 LINEへテキストまたは画像を投稿する
LINEはURLスキーマだけでテキストも画像も投稿出来ます。
ああなんて楽ちん。
テキストを投稿する場合
Intent intent = new Intent(Intent.ACTION_VIEW);
String messsage= Uri.encode("テスト #コメント");
intent.setData(Uri.parse("line://msg/text/" + messsage));
startActivity(intent);
画像を投稿したい場合
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("line://msg/image/" + imagePath));
startActivity(intent);
messsage文字列は、URLエンコードが必要です。
画像のpathは、LINEアプリが読み込める場所になければなりません。
また、画像は即投稿されます。デバッグ中に変な物を人に送りつけないように注意w
それぞれ、アプリがインストールされていない場合の対処をお忘れなく。