- Sharing Content between Android apps
- Sharing text
- Sharing HTML text
- Receiving text
- Sharing files and images
- Receiving files
- The Support Library is your friend
- Публикация контента в Android
- Предварительные требования
- Привязывание Facebook SDK с использованием Maven
- Дальнейшие предварительные требования
- Моделирование контента
- Ссылки
- Видео
- Мультимедийный контент
- Добавление интерфейсов для публикации контента
- Кнопки
- Кнопка «Поделиться»
- Диалог «Поделиться»
- Диалог сообщения
- Дополнительные функции
- Хэштеги
- Публикация цитаты
- Дополнительные материалы
- Встроенные альтернативные диалоги для публикации контента
- App Links
Sharing Content between Android apps
Sharing is caring, as they say, but sharing on Android means something perhaps slightly different. ‘Sharing’ is really shorthand for sending content such as text, formatted text, files, or images between apps.
So if ‘sharing’ == sending content, it makes slightly more sense that it is implemented using ACTION_SEND (or ACTION_SEND_MULTIPLE) Intents and its dozen extras.
While that approach is perfectly valid, I prefer to use ShareCompat, a set of classes in the v4 Support Library designed to make it easy to build intents for sharing content.
Sharing text
Sharing plain text is, as you might imagine, a good place to start. In fact, there’s not a whole lot to it:
ShareCompat.IntentBuilder uses a fluent API where you can chain together multiple method calls, using only the ones you need. For sharing, one of the most important parts is picking the right mime type — this is how apps filter what type of content they can receive. By using text/plain, we signify that our Intent will only contain plain text. Then, of course, setText() is how we actually add the CharSequence to the Intent to send. And while you can certainly send styled text using setText(), there’s no guarantee that the receiving app will honor that styling, so you should ensure that the text is legible with or without styling.
You’ll note we then use resolveActivity() before calling startActivity(). As mentioned in Protecting Implicit Intents with Runtime Checks, this is critical to prevent an ActivityNotFoundException when there is no Activity available to handle the mime type you have selected. While probably not as much of a concern with text/plain, it may be much more common with other types.
Note: when you use startActivity(shareIntent), that respects any default apps the user has set (i.e., if they’ve previously selected sharing all “text/plain” items to a certain app). If you’d like to instead always show a disambiguation chooser, use the intent generated from IntentBuilder.createChooserIntent() as explained in the ACTION_CHOOSER documentation.
Sharing HTML text
Some apps, most notably email clients, also support formatting with HTML. The changes, compared to plain text, are fairly minor:
The differences here are that we use of setHtmlText() in place of setText() and a mime type of text/html replacing text/plain. Here ShareCompat actually does a little bit extra: setHtmlText() also uses Html.fromHtml() to create a fallback formatted text to pass along to the receiving app if you haven’t previously called setText() yourself.
Given that many of the apps that can receive HTML text are email clients, there’s a number of helper methods to set the subject, to:, cc:, and bcc: email addresses as well — consider adding at least a subject to any share intent for best compatibility with email apps.
Of course, you’ll still want to call resolveActivity() just as before — nothing changes there.
Receiving text
While the focus so far has been on the sending side, it is helpful to know exactly what is happening on the other side (if not just to build a simple receiving app to install on your emulator for testing purposes). Receiving Activities add an intent filter to the Activity:
The action is obviously the more critical part — without that there’s nothing that would denote this as an ACTION_SEND (the action behind sharing). The mime type, same as with our sending code, is also present here. What isn’t as obvious are the two categories. From the element documentation:
Note: In order to receive implicit intents, you must include the CATEGORY_DEFAULT category in the intent filter. The methods startActivity() and startActivityForResult() treat all intents as if they declared the CATEGORY_DEFAULT category. If you do not declare it in your intent filter, no implicit intents will resolve to your activity.
So CATEGORY_DEFAULT is required for our use case. Then, CATEGORY_BROWSABLE allows web pages to natively share into apps without any extra effort required on the receiving side.
And to actually extract the information from the Intent, the useful ShareCompat.IntentReader can be used:
Similar to IntentBuilder, IntentReader is just a simple wrapper that make it easy to extract information.
Sharing files and images
While sending and receiving text is straightforward enough (create text, include it in Intent), sending files (and particularly images — the most common type by far) has an additional wrinkle: file permissions.
The simplest code you might try might look like
And that almost works — the tricky part is in getting a Uri to the File that other apps can actually read, particularly when it comes to Android 6.0 Marshmallow devices and runtime permissions (which include the now dangerous READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions).
My plea: don’t use Uri.fromFile(). It forces receiving apps to have the READ_EXTERNAL_STORAGE permission, won’t work at all if you are trying to share across users, and prior to KitKat, would require your app to have WRITE_EXTERNAL_STORAGE. And really important share targets, like Gmail, won’t have the READ_EXTERNAL_STORAGE permission — so it’ll just fail.
Instead, you can use URI permissions to grant other apps access to specific Uris. While URI permissions don’t work on file:// URIs as is generated by Uri.fromFile(), they do work on Uris associated with Content Providers. Rather than implement your own just for this, you can and should use FileProvider as explained in the File Sharing Training.
Once you have it set up, our code becomes:
Using FileProvider.getUriForFile(), you’ll get a Uri actually suitable for sending to another app — they’ll be able to read it without any storage permissions — instead, you are specifically granting them read permission with FLAG_GRANT_READ_URI_PERMISSION.
Note: we don’t call setType() anywhere when building our ShareCompat (even though in the video I did set it). As explained in the setDataAndType() Javadoc, the type is automatically inferred from the data URI using getContentResolver().getType(uriToImage). Since FileProvider returns the correct mime type automatically, we don’t need to manually specify a mime type at all.
If you’re interested in learning more about avoiding the storage permission, consider watching my Forget the Storage Permission talk or at least go through the slides, which covers this topic in depth at 14:55 (slide 11).
Receiving files
Receiving files isn’t too different from text because you’re still going to use ShareCompat.IntentReader. For example, to make a Bitmap out of an incoming file, it would look like:
Of course, you’re free to do whatever you want with the InputStream — watch out for images that are so large you hit an OutOfMemoryException. All of the things you know about loading Bitmaps still apply.
The Support Library is your friend
With both ShareCompat (and its IntentBuilder and IntentReader) and FileProvider in the v4 Support Library, you’ll be able to include sharing text, HTML text, and files in your app with the best practices by default.
Источник
Публикация контента в Android
В этом руководстве поясняется, как интегрировать в приложение Android функцию публикации контента на Facebook. Контент, которым люди делятся через ваше приложение, появляется в их хронике, а также может отображаться в Ленте новостей их друзей.
Кроме того, контентом из приложения можно делиться в Facebook Messenger.
Предварительные требования
Прежде чем дать пользователям возможность делиться на Facebook контентом из приложения, нужно привязать или скачать Facebook Sharing SDK для Android.
Sharing SDK для Android — это компонент Facebook SDK для Android. Чтобы использовать Facebook Sharing SDK в проекте, сделайте его зависимостью в Maven.
Привязывание Facebook SDK с использованием Maven
Откройте в своем проекте your_app | Gradle Scripts | build.gradle (Project) и добавьте в раздел buildscript < repositories <>> следующий репозиторий:
Откройте в своем проекте your_app | Gradle Scripts | build.gradle (Module: app) и добавьте в раздел dependencies<> следующее выражение:
При использовании Facebook SDK некоторые события в приложении регистрируются и собираются автоматически (если не отключить их автоматическую регистрацию). Подробнее о том, какая информация собирается и как отключить автоматическую регистрацию событий, см. в разделе, посвященном автоматической регистрации событий в приложении.
Дальнейшие предварительные требования
Выполните следующие действия:
Подробные сведения об этих требованиях см. в статье Начало работы с SDK для Android.
Также потребуется настроить ContentProvider в файле AndroidManifest.xml , где
Приложение, в котором интегрирована публикация контента, не должно заранее заполнять поля для контента, которым люди хотят поделиться. Это нарушение Политики платформы Facebook (см. правила для разработчиков).
Моделирование контента
В Facebook SDK версий 4.0 и выше предусмотрены новые модели публикации контента. Для каждого типа контента, которым хотят поделиться люди, предусмотрен свой класс. После моделирования контента добавьте в приложение интерфейс публикации.
Ссылки
Когда люди публикуют на Facebook ссылки из вашего приложения, в публикацию добавляется contentURL с соответствующей ссылкой. Подготовьте ссылки для публикации, используя модель ShareLinkContent . Список всех атрибутов см. в справке по ShareLinkContent .
Пример кода для запуска публикации:
Чтобы предварительно просмотреть публикуемую ссылку на App Store или Google Play, введите ее URL в отладчике репостов.
Если ваша публикация содержит ссылку на приложение в Google Play или App Store, описание и изображение в публикации будут игнорироваться. Вместо этого мы загрузим название и изображение приложения из магазина (если изображения в магазине нет, его не будет и в публикации).
Люди могут делиться на Facebook фотографиями из вашего приложения. Для этого используется диалог «Поделиться». Кроме того, на устройстве должно быть установлено нативное приложение Facebook для Android (версии 7.0 или более поздней).
Подготовьте контент фото для публикации, используя модель SharePhotoContent . Список всех атрибутов см. в справке по SharePhotoContent .
Видео
Люди могут делиться на Facebook видео из вашего приложения. Для этого используется диалог «Поделиться».
Подготовьте контент видео для публикации, используя модель ShareVideoContent . Список всех атрибутов см. в справке по ShareVideoContent .
Мультимедийный контент
Люди могут делиться мультимедийным контентом, содержащим фото и видео, из вашего приложения на Facebook с помощью диалога «Поделиться». Обратите внимание на следующие ограничения:
Подготовьте мультимедийный контент для публикации, используя модель ShareMediaContent . Список всех атрибутов см. в справке по ShareMediaContent .
Добавление интерфейсов для публикации контента
После создания модели контента запустите интерфейс Facebook для публикации.
Кнопки
Для запуска публикации контента можно воспользоваться нативными кнопками Facebook для Android.
Кнопка «Поделиться»
Кнопка «Поделиться» служит для вызова диалога «Поделиться». Чтобы добавить кнопку «Поделиться», вставьте в представление следующий фрагмент кода:
Диалог «Поделиться»
Этот диалог служит для переключения в нативное приложение Facebook для Android. После публикации он возвращает управление вашему приложению. В зависимости от используемого вами SDK для возврата в приложение, возможно, потребуется нажать стрелку назад. Если на устройстве не установлено приложение Facebook, диалог «Поделиться» автоматически переключается на веб-диалог.
Например, чтобы показать диалог ShareDialog для ссылки в вашем действии, создайте в методе onCreate экземпляр ShareDialog :
Затем покажите диалог ShareDialog:
Наконец, в onActivityResult вызовите callbackManager из SDK для обработки ответа:
Если вы используете действия или фрагменты AndroidX, не нужно переопределять onActivityResult .
Диалог сообщения
Этот диалог служит для переключения в нативное приложение Messenger для Android. После публикации он возвращает управление вашему приложению. В зависимости от используемого вами SDK для возврата в приложение, возможно, потребуется нажать стрелку назад.
Дополнительные функции
При использовании диалога «Поделиться» Facebook вы можете применять дополнительные функции, которые недоступны, если вы публикуете контент с помощью API.
Хэштеги
Для фото, ссылки или видео, которыми вы делитесь, можно указать один хэштег. Он также будет отображаться в диалоге «Поделиться». При желании люди могут удалить его перед публикацией.
Ниже показано, как добавить хэштег к ссылке.
Публикация цитаты
Вы можете позволить людям самостоятельно выделять текст, который будет отображаться как цитата со ссылкой. Кроме того, вы можете сами выбрать цитату, например врез в статье, который будет отображаться вместе со ссылкой. В любом случае цитата отображается в собственном поле отдельно от комментариев пользователя.
Дополнительные материалы
Встроенные альтернативные диалоги для публикации контента
В предыдущих версиях Facebook SDK для Android, прежде чем открыть диалог «Поделиться», приложению необходимо было проверить, установлено ли на устройстве нативное приложение Facebook, и предусмотреть соответствующий код для вызова альтернативной версии диалога, если оно отсутствует.
Теперь SDK автоматически проверяет наличие на устройстве нативного приложения Facebook. Если оно отсутствует, SDK переключает пользователя в его браузер по умолчанию и открывает диалоговое окно.
App Links
С помощью App Links можно создавать обратные ссылки на ваше приложение из публикаций на Facebook, которыми поделились из него. Когда человек нажимает такую публикацию, открывается ваше приложение. Можно также создать ссылку на определенный контент в приложении.
Источник