Redmi安卓13设备向未保存号码发送WhatsApp商务消息的问题
解决方案:Redmi安卓13上通过代码调用WhatsApp与未保存联系人交互
一、打开未保存联系人的WhatsApp聊天窗口
你的第一段代码失效主要有两个原因:
- 包名匹配错误:
com.whatsapp.w4b是WhatsApp商务版的包名,若你安装的是普通版WhatsApp,需改为com.whatsapp; - 号码格式不规范:必须传入带国际区号的完整号码(如
+8613xxxxxxxxx),仅输入纯手机号无法识别未保存联系人。
修正后的代码:
val toNumber = "+8613xxxxxxxxx" // 替换为带国际区号的目标号码 val uri = Uri.parse("smsto:$toNumber") val intent = Intent(Intent.ACTION_SENDTO, uri).apply { setPackage("com.whatsapp") // 商务版请替换为com.whatsapp.w4b addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } // 先检查设备是否安装了对应版本的WhatsApp if (packageManager.resolveActivity(intent, 0) != null) { startActivity(intent) } else { // 处理未安装WhatsApp的异常情况 }
二、向未保存联系人发送媒体文件(图片/视频)
要发送媒体,需使用ACTION_SEND Intent,结合媒体文件的Uri,同时处理安卓13的文件访问权限限制:
步骤1:准备合法的媒体Uri
- 若媒体是应用内部生成的文件,需通过
FileProvider获取Content Uri; - 若访问系统相册的媒体,安卓13及以上需动态申请
READ_MEDIA_IMAGES(图片)或READ_MEDIA_VIDEO(视频)权限。
步骤2:发送媒体的代码实现
val toNumber = "+8613xxxxxxxxx" val mediaUri = Uri.parse("content://xxx/xxx") // 替换为你的媒体文件Uri val intent = Intent(Intent.ACTION_SEND).apply { setPackage("com.whatsapp") // 核心参数:构造WhatsApp识别未保存联系人的JID putExtra("jid", "${toNumber.replace("+", "")}@s.whatsapp.net") putExtra(Intent.EXTRA_STREAM, mediaUri) type = "image/*" // 图片用image/*,视频用video/*,通用类型用*/* addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 必须添加此标记,允许WhatsApp读取你的文件Uri addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } if (packageManager.resolveActivity(intent, 0) != null) { startActivity(intent) }
额外说明:
- 若要同时发送文本+媒体,可添加
putExtra(Intent.EXTRA_TEXT, "你的文本内容"); jid参数是识别未保存联系人的关键,格式必须为去掉+号的纯号码@s.whatsapp.net。
三、通用注意事项
- 安卓13权限:访问系统媒体需提前动态申请对应权限,否则无法获取合法的媒体Uri;
- 号码验证:所有场景下必须使用带国际区号的完整号码,否则WhatsApp无法匹配未保存联系人;
- 版本兼容:确保设备上的WhatsApp是最新版本,旧版本可能不支持部分Intent参数。
内容的提问来源于stack exchange,提问作者Sabena yasmin P
相关产品推荐
相关产品推荐

