无论是有趣的图像、信息丰富的视频还是引人入胜的音频剪辑,启用用户共享内容都能丰富他们的体验并促进互动。本文档探讨了在 Android 上共享媒体的基础知识,包括集成此功能所需的 API 和技术。
专为共享而设计
Android 的设计促进了基于Intent的系统中应用之间的互操作性。Intent 是要执行的操作的抽象描述。Intent 允许应用相互通信,而无需了解彼此的详细信息。
当应用想要共享数据或启动操作时,它会创建一个指定内容类型和操作的 Intent。Android 系统会显示一个可以处理该 Intent 的相关应用列表,允许用户选择要使用的应用。这种方法促进了协作生态系统。
共享文本只需几行代码
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 分享表UI,允许用户通过一次点击与他人共享信息——包括相关的应用建议。您可以使用 Android 分享表执行的其他操作包括
请参阅将简单数据发送到其他应用以获取有关 Android 分享表及其使用方法的更多信息。
提供直接共享目标,以便其他应用的用户能够更轻松、更快速地与您的应用共享 URL、图像或其他类型的数据。直接共享的工作原理是在 Android 分享表上直接显示来自消息和社交应用的联系人,而无需用户选择应用,然后搜索联系人。
支持接收富内容通过OnReceiveContentListener
。此 API 为您的代码提供了一个处理接收所有内容的单一位置,从纯文本和样式化文本到标记、图像、视频、音频文件等。内容可以来自图像键盘、拖放或剪贴板。
共享媒体文件
Intent 只能包含少量数据,因此 Android 提供了一种让 Intent 包含文件安全句柄的方法。从您的应用安全共享媒体文件涉及
- 配置您的应用以提供文件的安全句柄——以内容 URI 的形式——使用 Android
FileProvider
组件。 - 在清单中指定可共享目录。
- 使用
getUriForFile
创建一个内容 URL,作为文件的安全句柄。 - 创建一个 Intent,授予文件权限。
请参阅关于文件共享,了解有关如何安全共享文件的更多信息。
优化共享媒体
无论您是在应用内共享媒体,还是在与其他应用共享媒体,您都需要确保共享的媒体提供高质量的共享体验。
平衡质量和大小
大型媒体文件会快速消耗带宽和存储空间,从而导致用户遇到令人沮丧的延迟以及潜在的数据超额费用。压缩是您在此处的最佳选择。
- 图像压缩:利用现代图像压缩格式,例如 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类以 Exif 标签的形式将元数据写入 JPEG、PNG 和 WebP 图像。
// 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()