Публикация материалов в Android
В этом руководстве мы расскажем о том, как интегрировать в приложение Android функцию публикации материалов на Facebook. Материалы, которыми люди делятся через ваше приложение, появляются в их Хронике, а также могут отображаться в Ленте новостей их друзей.

Также материалами из приложения можно делиться в Facebook Messenger.
Предварительные требования
Вот что вам нужно сделать, чтобы добавить в свое приложение возможность делиться материалами на Facebook:
- Добавьте в среду разработки мобильных приложений Facebook SDK для Android.
- Получите настроенный ID приложения Facebook и свяжите его с вашим приложением Android. См. раздел Начало работы с Android SDK — Добавление ID приложения Facebook.
- Создайте хэш-ключ Android и добавьте его в свой профиль разработчика.
- Добавьте
Facebook Activityи включите его в файлAndroidManifest.xml.
Подробные сведения об этих требованиях см. в разделе Начало работы с Android SDK.
Также потребуется добавить ContentProvider в файл AndroidManifest.xml, где {APP_ID} — это ID вашего приложения:
<provider android:authorities="com.facebook.app.FacebookContentProvider{APP_ID}"
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>Приложение, в котором интегрирована публикация материалов, не должно предварительно заполнять какие-либо материалы, которыми люди хотят поделиться, поскольку это противоречит Политике Платформы Facebook. Подробнее см. раздел 2.3 этой Политики.
Моделирование материалов
В Facebook SDK версии 4.0 и более поздних версиях есть новые модели для публикации материалов. Для каждого типа материалов, которыми хотят поделиться люди, предусмотрен свой класс, который вы можете использовать. После моделирования материалов добавьте в приложение интерфейс публикации.
Ссылки
Когда люди делятся на Facebook ссылками из вашего приложения, в них добавляются атрибуты, которые отображаются в публикации:
contentURL— публикуемая ссылка;contentTitle— заголовок материалов в ссылке;imageURL— URL-адрес миниатюры, которая будет отображаться в публикации;contentDescription— описание материалов (обычно 2-4 предложения).

Создайте публикуемые материалы для ссылок с помощью модели ShareLinkContent. Список всех атрибутов см. в справке по ShareLinkContent.
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://developers.facebook.com"))
.build();Примечание. Если в вашем приложении можно делиться ссылками на iTunes или Google Play, имейте в виду, что мы не публикуем изображения или описания, которые вы указываете в публикуемых материалах. Вместо этих сведений мы публикуем информацию о приложении, полученную краулером Webcrawler напрямую из магазина приложений. В ней может не быть изображений. Чтобы предварительно просмотреть публикуемую ссылку на iTunes или Google Play, введите URL ссылки в отладчике публикаций.
Фото
Люди могут делиться на Facebook фото из вашего приложения. Для этого можно использовать диалог «Поделиться» или индивидуально настроенный интерфейс.
- Размер фото не должен превышать 12 МБ.
- Кроме того, на устройстве должно быть установлено нативное приложение Facebook для Android (версии 7.0 или более поздней).

Создайте публикуемые материалы для фото с помощью модели SharePhotoContent. Список всех атрибутов см. в справке по SharePhotoContent.
Bitmap image = ...
SharePhoto photo = new SharePhoto.Builder()
.setBitmap(image)
.build();
SharePhotoContent content = new SharePhotoContent.Builder()
.addPhoto(photo)
.build();Видео
Люди могут делиться на Facebook видео из вашего приложения. Для этого можно использовать диалог «Поделиться» или индивидуально настраиваемый интерфейс.
Размер видео не должен превышать 12 МБ.
Создайте публикуемые для видео материалы с помощью модели ShareVideoContent. Список всех атрибутов см. в справке по ShareVideoContent.
Uri videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
.setLocalUrl(videoUrl)
.build();
ShareVideoContent content = new ShareVideoContent.Builder()
.setVideo(video)
.build();Мультимедийные материалы
Люди могут делиться мультимедийными материалами, содержащими фото и видео, из вашего приложения на Facebook с помощью диалога «Поделиться». Обратите внимание:
- У человека должно быть установлено нативное приложение Facebook для Android версии 71 или более поздней.
- Размер фото не должен превышать 12 МБ.
- Размер видео не должен превышать 12 МБ.
- Одновременно можно публиковать максимум 6 видео и фото.
Создайте мультимедийные материалы для публикации с помощью модели ShareMediaContent. Список всех атрибутов см. в справке по ShareMediaContent.
SharePhoto sharePhoto1 = new SharePhoto.Builder()
.setBitmap(...)
.build();
SharePhoto sharePhoto2 = new SharePhoto.Builder()
.setBitmap(...)
.build();
ShareVideo shareVideo1 = new ShareVideo.Builder()
.setLocalUrl(...)
.build();
ShareVideo shareVideo2 = new ShareVideo.Builder()
.setLocalUrl(...)
.build();
ShareContent shareContent = new ShareMediaContent.Builder()
.addMedium(sharePhoto1)
.addMedium(sharePhoto2)
.addMedium(shareVideo1)
.addMedium(shareVideo2)
.build();
ShareDialog shareDialog = new ShareDialog(...);
shareDialog.show(shareContent, Mode.AUTOMATIC);
Добавление интерфейсов для публикации материалов
После создания модели для материалов можно либо запустить интерфейс Facebook для публикации материалов, либо создать собственный интерфейс, который вызывает API Graph.
Кнопки
Для запуска публикации материалов можно воспользоваться нативными кнопками Facebook для Android.
Кнопка «Нравится»
Кнопка «Нравится» — это быстрый и удобный способ поделиться материалами с друзьями. Она позволяет одним нажатием отметить материалы приложения как понравившиеся и поделиться ими на Facebook. Чтобы добавить кнопку «Нравится», добавьте в представление следующий фрагмент кода:
LikeView likeView = (LikeView) findViewById(R.id.like_view);
likeView.setObjectIdAndType(
"https://www.facebook.com/FacebookDevelopers",
LikeView.ObjectType.PAGE);Кнопка «Поделиться»
Кнопка «Поделиться» служит для вызова диалога «Поделиться». Чтобы добавить кнопку «Поделиться», добавьте в представление следующий фрагмент кода:
ShareButton shareButton = (ShareButton)findViewById(R.id.fb_share_button); shareButton.setShareContent(content);
Кнопка «Отправить»
С помощью этой кнопки можно делиться фото, видео и ссылками с друзьями и контактами в личных сообщениях Facebook Messenger. Кнопка «Отправить» служит для вызова диалога сообщения. Чтобы добавить кнопку «Отправить», добавьте в представление следующий фрагмент кода:
SendButton sendButton = (SendButton)findViewById(R.id.fb_send_button);
sendButton.setShareContent(shareContent);
sendButton.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { ... });Диалог «Поделиться»
Этот диалог служит для переключения в нативное приложение Facebook для Android. После публикации он возвращает управление вашему приложению. Если же на устройстве не установлено приложение Facebook, диалог автоматически переключается на веб-диалог, который используется в качестве альтернативы.
ShareDialog.show(activityOrFragment, content);
Например, чтобы показать диалог ShareDialog для ссылки в вашем действии, создайте в методе ShareDialog экземпляр onCreate:
public class MainActivity extends FragmentActivity {
CallbackManager callbackManager;
ShareDialog shareDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
shareDialog = new ShareDialog(this);
// this part is optional
shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { ... });
}Затем отобразите диалог ShareDialog:
if (ShareDialog.canShow(ShareLinkContent.class)) {
ShareLinkContent linkContent = new ShareLinkContent.Builder()
.setContentTitle("Hello Facebook")
.setContentDescription(
"The 'Hello Facebook' sample showcases simple Facebook integration")
.setContentUrl(Uri.parse("http://developers.facebook.com/android"))
.build();
shareDialog.show(linkContent);
}Наконец, в callbackManager вызовите onActivityResult из имеющегося SDK для обработки отклика:
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}Диалог сообщения
Этот диалог служит для переключения в нативное приложение Messenger для Android. После публикации он возвращает управление вашему приложению.
MessageDialog.show(activityOrFragment, content);
Дополнительные функции
При использовании диалога «Поделиться» Facebook вы можете применять дополнительные функции, которые недоступны, если вы делитесь материалами с помощью API.
Хэштеги
Для фото, ссылки или видео, которыми вы делитесь, можно указать один хэштег. Он также будет отображаться в диалоге «Поделиться». Перед публикацией люди, если пожелают, смогут удалить его.
Ниже показано, как добавить хэштег к ссылке.
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://developers.facebook.com"))
.setShareHashtag(new ShareHashtag.Builder()
.setHashtag("#ConnectTheWorld")
.build());
.build();
Публикация цитаты
Вы можете позволить людям самостоятельно выделять текст, который будет отображаться как цитата со ссылкой. Или же вы можете сами выбрать цитату, например врез в статье, который будет отображаться вместе со ссылкой. В любом случае цитата появляется в своем собственном поле отдельно от комментариев пользователя.
ShareLinkContent content = new ShareLinkContent.Builder()
.setContentUrl(Uri.parse("https://developers.facebook.com"))
.setQuote("Connect on a global scale.")
.build();
Дополнительная информация
Встроенные альтернативные диалоги для публикации материалов
В предыдущих версиях SDK для Android, прежде чем открыть диалог «Поделиться», приложению необходимо было проверить, установлено ли на устройстве нативное приложение Facebook. Если нет, то разработчик должен был добавить соответствующий код для вызова альтернативной версии диалога.
Теперь SDK автоматически проверяет наличие на устройстве нативного приложения Facebook. Если оно отсутствует, SDK переключает людей в браузер по умолчанию и открывает диалоговое окно. Если человек хочет поделиться новостью Open Graph, SDK открывает веб-диалог «Поделиться».
Ссылки на приложение
Ссылки на приложение служат для создания обратных ссылок на ваше приложение из публикаций на Facebook, которыми поделились из него. Когда человек нажимает публикацию в Facebook, которой поделились из вашего приложения, открывается это приложение. Можно даже создать ссылку на определенные материалы в приложении.
Индивидуально настраиваемый интерфейс
Если вы решили использовать собственный интерфейс для публикации материалов, потребуется выполнить следующее:
- Создайте индивидуально настроенный интерфейс для публикации в эндпойнт API Graph
/me/feed. - Интегрируйте в свое приложение «Вход через Facebook»
- Запросите разрешение
publish_actionsдля людей, которые входят в ваше приложение
Вот код для публикации ссылки на Facebook из собственного интерфейса:
ShareApi.share(content, null);
Публикация новостей Open Graph
Новости Open Graph позволяют людям делиться структурированными материалами с помощью строго типизированного API, включающего действия и объекты Open Graph. В таких публикациях имеются обратные ссылки на ваше приложение или на его страницу в магазине приложений.
Подробнее о настройке новостей Open Graph см. здесь.
Создайте публикуемые для действий Open Graph материалы с помощью модели ShareOpenGraphContent. Список всех атрибутов см. в справке по ShareOpenGraphContent.
ShareOpenGraphObject object = new ShareOpenGraphObject.Builder()
.putString("og:type", "fitness.course")
.putString("og:title", "Sample Course")
.putString("og:description", "This is a sample course.")
.putInt("fitness:duration:value", 100)
.putString("fitness:duration:units", "s")
.putInt("fitness:distance:value", 12)
.putString("fitness:distance:units", "km")
.putInt("fitness:speed:value", 5)
.putString("fitness:speed:units", "m/s")
.build();
ShareOpenGraphAction action = new ShareOpenGraphAction.Builder()
.setActionType("fitness.runs")
.putObject("fitness:course", object)
.build();
ShareOpenGraphContent content = new ShareOpenGraphContent.Builder()
.setPreviewPropertyName("fitness:course")
.setAction(action)
.build();