[android] 특정 앱으로만 공유하기

이해는 안되지만, 가끔 공유하기 창에 특정 앱만 표시되게 해달라는 갑님이 계신다.

굳이 다이얼로그를 따로 만들 필요없이 이렇게만 하면 된다.

 

String url = "http://google.com";

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");

List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
if (resInfo.isEmpty()) {
  Log.i("###", "공유할 수 있는 앱 없음");
  return; 
}

List<Intent> targetedShareIntents = new ArrayList<>();

for (ResolveInfo resolveInfo : resInfo) {
  String packageName = resolveInfo.activityInfo.packageName;
  Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND);
  targetedShareIntent.setType("text/plain");

  // 페이스북, 카카오톡, 카카오 스토리만 표시
  if (packageName.contains("com.facebook.katana") || packageName.contains("com.kakao.talk") || packageName.contains("com.kakao.story")) {
    ComponentName name = new ComponentName(packageName, resolveInfo.activityInfo.name);
    targetedShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, url);
    targetedShareIntent.setComponent(name);
    targetedShareIntent.setPackage(packageName);
    targetedShareIntents.add(targetedShareIntent);
  }
}

if (targetedShareIntents.isEmpty()) {  
  Log.i("###", "공유할 수 있는 앱 없음");
  return;
}

Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "공유하기");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
startActivity(chooserIntent);