Об обмене медиа

Будь то забавное изображение, информативное видео или увлекательный аудиоклип, предоставление пользователям возможности делиться контентом обогащает их опыт и способствует вовлечению. В этом документе рассматриваются основы обмена мультимедиа на Android, включая API и методы, необходимые для интеграции этой возможности.

Создан для обмена

Дизайн Android способствует взаимодействию между приложениями, использующими систему, основанную на намерениях . Намерение — это абстрактное описание операции, которую необходимо выполнить. Намерения позволяют приложениям взаимодействовать друг с другом, не зная особенностей друг друга.

Когда приложение хочет поделиться данными или инициировать действие, оно создает намерение, определяющее тип контента и операцию. Система Android представляет список соответствующих приложений, которые могут обрабатывать это намерение, позволяя пользователю выбирать, какое приложение использовать. Такой подход способствует созданию совместной экосистемы.

Для обмена текстом требуется всего несколько строк кода:

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to share.")
    type = "text/plain"
}

val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)

Строка createChooser отображает пользовательский интерфейс Android Sharesheet , который позволяет пользователям обмениваться информацией с людьми, включая предложения соответствующих приложений, одним касанием. Другие возможности Android Sharesheet:

Дополнительную информацию об общих таблицах Android и их использовании см. в разделе «Отправка простых данных в другие приложения» .

Предоставьте цели Direct Share, чтобы пользователям других приложений было проще и быстрее обмениваться URL-адресами, изображениями или другими видами данных с вашим приложением. Direct Share представляет контакты из приложений для обмена сообщениями и социальных сетей непосредственно в таблице Android Sharesheet, при этом пользователям не нужно выбирать приложение и затем искать контакт.

Поддержка получения разнообразного контента через OnReceiveContentListener . Этот API предоставляет единое место для вашего кода для обработки получения всего контента: от простого и стилизованного текста до разметки, изображений, видео, аудиофайлов и т. д. Содержимое может быть получено с помощью графических клавиатур, перетаскивания или буфера обмена.

Делитесь медиафайлами

Намерения могут содержать только небольшой объем данных, поэтому Android предоставляет возможность Намерениям содержать безопасный дескриптор файлов. Безопасный обмен медиафайлами из вашего приложения включает в себя:

Дополнительную информацию о том, как безопасно обмениваться файлами, см. в разделе Об обмене файлами .

Оптимизируйте медиа для обмена

Независимо от того, делитесь ли вы мультимедиа с другими пользователями в своем приложении или делитесь медиафайлами с другим приложением, вы должны быть уверены, что делитесь медиафайлами, которые обеспечивают высокое качество обмена.

Нахождение баланса между качеством и размером

Большие медиафайлы могут быстро занимать полосу пропускания и пространство для хранения, что приводит к неприятным задержкам и потенциальным расходам за перерасход данных для ваших пользователей. Сжатие здесь ваш лучший друг.

  • Сжатие изображений : используйте современные форматы сжатия изображений, такие как WebP и AVIF, которые обеспечивают более высокую степень сжатия по сравнению с традиционными JPEG без значительной потери качества. Поэкспериментируйте с различными настройками качества, чтобы найти золотую середину.
  • Сжатие видео : используйте возможности сжатия видео AV1 или H.265 (HEVC), чтобы обеспечить более высокую эффективность сжатия при сохранении превосходного качества изображения. Вы можете проверить наличие аппаратного кодирования на устройствах Android 10+, а также mediaPerformanceClass , чтобы определить, что ваше устройство лучше всего поддерживает. Рассмотрите возможность предложения различных вариантов разрешения для удовлетворения различных предпочтений пользователя и условий сети.
fun hasHardwareEncodingSupportFor(mimeType: String): Boolean {
    val codecList = MediaCodecList(REGULAR_CODECS)
    val codecInfos = codecList.codecInfos
    for ( codecInfo in codecInfos ) {
        if (!codecInfo.isEncoder()) {
            continue;
        }
        if (!codecInfo.isHardwareAccelerated()) {
            continue;
        }
        val types: Array<String> = codecInfo.getSupportedTypes()
        for (j in types.indices) {
            if (types[j].equals(mimeType, ignoreCase = true)) {
                return true
            }
        }
    }
    return false
}
// test for AV1 hardware encoding support
val hasAV1 = hasHardwareEncodingSupportFor("video/av01")

Адаптация медиа

Платформы социальных сетей часто требуют определенных размеров и соотношений сторон для общих медиа. Заблаговременно изменяя размер и обрезая медиафайлы перед отправкой , вы можете избежать неожиданных искажений или проблем с форматированием, когда пользователи публикуют сообщения на своих любимых платформах.

Предоставьте четкие инструкции и рекомендации о том, как пользователи могут оптимизировать свои медиафайлы перед публикацией. Сюда могут входить советы по настройке битрейта кодирования , настройке параметров квантования , выбору формата видео , выбору подходящего размера файла или пониманию влияния различных вариантов совместного использования.

Повышение доступности СМИ

Добавление соответствующих метаданных, таких как заголовки, описания и теги, в ваши медиафайлы может улучшить их обнаруживаемость. Поощряйте пользователей добавлять свои собственные описания и подписи при публикации, что еще больше персонализирует опыт.

Добавляйте метаданные к изображениям

Класс Jetpack ExifInterface записывает метаданные в изображения JPEG, PNG и WebP в виде тегов Exif.

// sets the title of the image in the form of Exif data
val exif = ExifInterface(imageFile)
exif.setAttribute(ExifInterface.TAG_IMAGE_DESCRIPTION, "Beautiful sunset")
exif.saveAttributes()