2014年4月11日金曜日

Facebookとそれ以外でACTION_SENDで渡すテキストを変える

Facebookはポリシーで投稿のpre-fillを禁止している(https://developers.facebook.com/policy/)ため、テキストの代わりにリンクを共有することがよくあります。

前回の「「ギャラリーから選択」と「カメラで撮影」を1つのchooserで表示する。」と同じ方法を使うと、Facebookとそれ以外でIntent.EXTRA_TEXTに含める文字列を変えることができます。
  1. /** 
  2.  * Facebook ではリンクを共有し、それ以外(FB Messenger 含む)ではテキストを共有する 
  3.  */  
  4. private void share() {  
  5.     Intent intent = new Intent(Intent.ACTION_SEND);  
  6.     intent.setType("text/plain");  
  7.   
  8.     List<ResolveInfo> resInfo = getActivity().getPackageManager()  
  9.                                              .queryIntentActivities(intent, 0);  
  10.     if (resInfo.isEmpty()) {  
  11.         return;  
  12.     }  
  13.   
  14.     String shareText = getString(R.string.share_text);  
  15.     String shareTextFacebook = getString(R.string.share_link);  
  16.   
  17.     List<Intent> shareIntentList = new ArrayList<>();  
  18.   
  19.     for (ResolveInfo info : resInfo) {  
  20.         Intent shareIntent = (Intent) intent.clone();  
  21.   
  22.         if (info.activityInfo.packageName.toLowerCase()  
  23.                                          .equals("com.facebook.katana")) {  
  24.             shareIntent.putExtra(Intent.EXTRA_TEXT, shareTextFacebook);  
  25.         } else {  
  26.             shareIntent.putExtra(Intent.EXTRA_TEXT, shareText);  
  27.         }  
  28.         shareIntent.setPackage(info.activityInfo.packageName);  
  29.         shareIntentList.add(shareIntent);  
  30.     }  
  31.   
  32.     Intent chooserIntent = Intent.createChooser(shareIntentList.remove(0),   
  33.                                                 getString(R.string.select_app));  
  34.     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,   
  35.                            shareIntentList.toArray(new Parcelable[]{}));  
  36.     startActivity(chooserIntent);  
  37. }  

1 件のコメント:

  1. shareIntent.setPackage(info.activityInfo.packageName);
    の部分は
    shareIntent.setClassName(info.activityInfo.packageName, info.activityInfo.name);
    にしておかないと、1つのapk に反応する Activity が複数ある時に期待通りの表示がされなかった。

    具体的には、 image/jpeg な Intent のときのGoogle+ でうまくいっていなかった。

    返信削除