Совместное использование Android на Facebook и других социальных сетях
Я хотел бы поделиться простым текстом через Facebook
и другие социальные сети (Google+, Twitter, ...)
Мой исходный код выглядел так:
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Test Subject");
shareIntent.putExtra(Intent.EXTRA_TITLE, "Test Title");
shareIntent.putExtra(Intent.EXTRA_TEXT, "Only link visible in FB: http://www.google.com/");
startActivity(Intent.createChooser(shareIntent, "Test Intent"));
Если я не ошибаюсь, Facebook позволяет мне делиться только ссылкой (или некой выдержкой из веб-сайта), указанной через EXTRA_TEXT
,
Хотя делиться ссылкой - это хорошо, я хочу поделиться с ней и собственным текстом, поэтому я связал свой проект с Facebook SDK и сумел создать больше возможностей для совместного использования. Тем не менее, поскольку делиться с Facebook это не было сделано через Intent, я потерял свой Intent.createChooser
который показывает пользователям хорошо известный список вариантов обмена.
Мой вопрос, могу ли я иметь по умолчанию Intent.createChooser
но использовать пользовательский обмен при выборе иконок Facebook? Если нет, то каковы другие варианты?
Спасибо!
1 ответ
Я нашел решение.
Как я уже упоминал в своем первоначальном вопросе, я инкапсулировал свой общий доступ к Facebook (с помощью Facebook SDK) в Activity
учебный класс ShareFacebook
следуя инструкциям на FB.
Тогда я использовал это ShareFacebook Activity
как Intent
и заменил оригинал Intent
(который обычно создается Intent.createChooser
) как это:
String myPackageName = getPackageName();
String[] blacklist = new String[]{"com.pinterest", "com.tunewiki.lyricplayer.android", "com.dropbox.android", "com.google.zxing.client.android", "com.adobe.reader", "com.google.android.apps.docs", "flipboard.app"};
Set<Integer> usedSharingApps = new HashSet<Integer>();
int facebookHash1 = "com.facebook.katana".hashCode();
int facebookHash2 = "com.facebook.wakizashi".hashCode();
// share result
// By default intent only link is possible to share on facebook
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()){
for (ResolveInfo resolveInfo : resInfo) {
String packageName = resolveInfo.activityInfo.packageName;
Intent targetShareIntent;
int appId = packageName.hashCode();
if (packageName.equals(myPackageName)
|| Arrays.asList(blacklist).contains(packageName) /* skip some other packages */
|| usedSharingApps.contains(appId)) {
continue;
} else if (packageName.equals("com.facebook.katana") || packageName.equals("com.facebook.wakizashi")) {
usedSharingApps.add(appId);
Intent targetShareIntentTmp = new Intent(getApplicationContext(), ShareFacebook.class);
targetShareIntentTmp.addCategory("android.intent.category.ALTERNATIVE");
targetShareIntentTmp.setAction(Intent.ACTION_SEND);
targetShareIntentTmp.setType("text/plain");
targetShareIntentTmp.setPackage(myPackageName);
targetShareIntentTmp.setComponent(new ComponentName(getPackageName(), ShareFacebook.class.getName()));
targetShareIntentTmp.putExtra(Intent.EXTRA_SUBJECT, "FacebookDialog Description");
targetShareIntentTmp.putExtra(Intent.EXTRA_TITLE, "FacebookDialog Name");
targetShareIntentTmp.putExtra(Intent.EXTRA_TEXT, "http://stackru.com");
targetShareIntent = new LabeledIntent(targetShareIntentTmp, myPackageName, R.string.facebook, R.drawable.fb_logo_blue);
} else {
usedSharingApps.add(appId);
targetShareIntent = new Intent();
targetShareIntent.setAction(Intent.ACTION_SEND);
targetShareIntent.setType("text/plain");
targetShareIntent.setPackage(packageName);
targetShareIntent.putExtra(Intent.EXTRA_SUBJECT, "SUBJECT visible by mail or sms app");
targetShareIntent.putExtra(Intent.EXTRA_TITLE, "TITLE - visible anywhere?");
targetShareIntent.putExtra(Intent.EXTRA_TEXT, "All this text visible in every intent http://www.google.com/");
}
targetedShareIntents.add(targetShareIntent);
}
}
if (!usedSharingApps.contains(facebookHash1) && !usedSharingApps.contains(facebookHash2)) {
// user does not have facebook app but we still want to share since it took us such effort to use facebook sharing!
Intent targetShareIntentTmp = new Intent(getApplicationContext(), ShareFacebook.class);
targetShareIntentTmp.addCategory("android.intent.category.ALTERNATIVE");
targetShareIntentTmp.setAction(Intent.ACTION_SEND);
targetShareIntentTmp.setType("text/plain");
targetShareIntentTmp.setPackage(myPackageName);
targetShareIntentTmp.setComponent(new ComponentName(getPackageName(), ShareFacebook.class.getName()));
targetShareIntentTmp.putExtra(Intent.EXTRA_SUBJECT, "FacebookDialog Description");
targetShareIntentTmp.putExtra(Intent.EXTRA_TITLE, "FacebookDialog Name");
targetShareIntentTmp.putExtra(Intent.EXTRA_TEXT, "http://stackru.com");
Intent targetShareIntent = new LabeledIntent(targetShareIntentTmp, myPackageName, R.string.facebook, R.drawable.fb_logo_blue);
targetedShareIntents.add(targetShareIntent);
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
startActivity(chooserIntent);
В файл манифеста я добавил:
<activity
android:name="your.package.ShareFacebook" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.ALTERNATIVE" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
Изменение манифеста было довольно важным, в противном случае я получал эту ошибку: "Не найдена активность для намерения"
Я также скачал логотип Facebook и скопировал его в ресурсы моего проекта под именем "fb_logo_blue.png" (имя файла должно содержать только a-z0-9_).
Для этих двух дополнительных строк (Описание FacebookDialog + Имя FacebookDialog) мне пришлось связываться с FB SDK и убивать так много часов! Ну, по крайней мере, теперь я могу поделиться на телефонах без установленного приложения Facebook.
Мой результат на Facebook: