自定义Android Kotlin键盘向WhatsApp发送动图贴纸变静态问题咨询
自定义Android键盘向WhatsApp发送动图贴纸问题解答
问题背景
我用Kotlin开发了一款自定义Android键盘应用(KBoard),支持直接向WhatsApp聊天发送贴纸。静态贴纸能正常使用,但动图贴纸发送后始终显示为静态图片。
已尝试操作
- 将贴纸导出为动图WebP格式(512×512像素,透明,大小超过500KB)
- 使用FileProvider生成
content://URI - 通过
InputConnectionCompat.commitContent提交内容,MIME类型设为"image/webp.wasticker" - 验证WhatsApp接受该MIME类型且
commitContent调用成功 - 清除WhatsApp缓存排除旧静态缓存版本
核心代码片段
fun sendAnimatedStickerToWhatsApp(uri: Uri, mimeType: String = "image/webp.wasticker") { val editorInfo = currentInputEditorInfo ?: return val inputConnection = currentInputConnection ?: return if (EditorInfoCompat.getContentMimeTypes(editorInfo).contains(mimeType)) { val clipDescription = ClipDescription("WhatsApp Sticker", arrayOf(mimeType)) val inputContentInfo = InputContentInfoCompat(uri, clipDescription, null) InputConnectionCompat.commitContent( inputConnection, editorInfo, inputContentInfo, InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION, null ) } }
核心问题:提交操作成功,但WhatsApp仍将动图WebP转为静态贴纸。
问题解答
1. WhatsApp是否要求动图贴纸必须通过Cloud API Media API + Messages API(带media_id)发送才能保持动画效果,而非通过键盘的commitContent?
不需要。第三方键盘完全可以通过commitContent发送动图贴纸并保留动画效果,Cloud API是针对商业/开发者平台的批量消息发送场景,和普通聊天的键盘输入场景无关。
2. 若commitContent支持动图贴纸,需使用何种准确的MIME类型或元数据以避免静态化?
不要用image/webp.wasticker,这个MIME类型是针对WhatsApp官方贴纸包的静态贴纸设计的。正确的动图贴纸MIME类型应该是image/webp,并且需要确保WebP文件本身是动画格式(而非静态WebP)。另外,提交时可以在ClipDescription中添加额外的元数据标记,帮助WhatsApp识别动图属性。
调整后的代码示例:
fun sendAnimatedStickerToWhatsApp(uri: Uri) { val editorInfo = currentInputEditorInfo ?: return val inputConnection = currentInputConnection ?: return val mimeType = "image/webp" if (EditorInfoCompat.getContentMimeTypes(editorInfo).contains(mimeType)) { val clipDescription = ClipDescription("WhatsApp Animated Sticker", arrayOf(mimeType)).apply { putExtra("android.content.extra.STICKER_ANIMATED", true) } val inputContentInfo = InputContentInfoCompat(uri, clipDescription, null) InputConnectionCompat.commitContent( inputConnection, editorInfo, inputContentInfo, InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION, null ) } }
3. 是否存在额外要求(如循环标记、WebP的ANIM/ALPH块、contents.json中的元数据)才能让WhatsApp识别为动图贴纸?
有几个关键要求:
- WebP文件结构:必须包含
ANIM和ANMF块(动画WebP的核心结构),不能是静态WebP改后缀。可以用webpinfo工具验证文件是否为动画格式。 - 循环设置:动画WebP需要设置循环次数(通常设为0表示无限循环),这是WhatsApp识别动图的必要条件之一。
- 尺寸与大小:保持512×512像素,文件大小建议在500KB到1MB之间(过大可能被压缩),透明通道需保留。
- 不需要
contents.json:这个文件是官方贴纸包的配置文件,通过键盘发送单张贴纸时不需要提供。
4. 第三方键盘应用能否在普通WhatsApp聊天中发送可内嵌播放的动图贴纸,还是仅支持通过商业云API实现?
第三方键盘完全可以在普通WhatsApp聊天中发送可内嵌播放的动图贴纸,不需要依赖商业云API。只要满足上述WebP格式要求、正确的MIME类型和提交方式,就能实现动画效果。
内容的提问来源于stack exchange,提问作者Ashwin Soni
相关产品推荐
相关产品推荐

