如何使用Xamarin实现通过WhatsApp向联系人号码发送图片
Xamarin实现通过WhatsApp向通讯录联系人发送图片的方案
前提说明
- 需要先获取到通讯录中目标联系人的带国家码的完整手机号,WhatsApp仅支持完整格式的手机号识别,不支持短号或本地格式号码
- 需要确认目标手机号已经注册了WhatsApp账号,否则调用后会提示用户邀请该联系人注册
- 图片需要先存储到设备公共可读取区域,确保WhatsApp有权限访问资源
Android 平台实现
- 提前申请必要权限:
READ_CONTACTS、Android 12及以下申请READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE,Android 13+申请READ_MEDIA_IMAGES - 发图逻辑代码示例:
// 替换为目标联系人的完整带国家码手机号,不需要+号或空格,例如中国手机号138xxxx1234填写为86138xxxx1234 string targetPhone = "8613800138000"; // 替换为你的图片本地Uri Android.Net.Uri imageUri = Android.Net.Uri.Parse("content://com.你的包名.fileprovider/图片路径/test.jpg"); Intent sendIntent = new Intent(); sendIntent.SetAction(Intent.ActionSend); sendIntent.PutExtra(Intent.ExtraStream, imageUri); sendIntent.SetType("image/*"); sendIntent.SetPackage("com.whatsapp"); sendIntent.PutExtra("jid", $"{targetPhone}@s.whatsapp.net"); if (sendIntent.ResolveActivity(PackageManager) != null) { StartActivity(sendIntent); } else { // 未安装WhatsApp的提示逻辑 }
Android 7.0及以上版本需要使用FileProvider生成content://格式的Uri提供给WhatsApp,不要直接使用file://格式的Uri,否则会触发权限错误。
iOS 平台实现
- 先在Info.plist中添加WhatsApp的Scheme白名单:
<key>LSApplicationQueriesSchemes</key> <array> <string>whatsapp</string> </array>
- 发图逻辑代码示例:
// 替换为目标联系人完整带国家码手机号,格式为带+号的完整号码 string targetPhone = "+8613800138000"; // 替换为你要发送的图片对象 UIImage sendImage = UIImage.FromFile("test.jpg"); // 先保存图片到相册确保WhatsApp可读取 UIImage.WriteToSavedPhotosAlbum(sendImage, (image, error, context) => { if (error == null) { var whatsappUrl = new NSUrl($"whatsapp://send?phone={targetPhone}"); if (UIApplication.SharedApplication.CanOpenUrl(whatsappUrl)) { var activityController = new UIActivityViewController(new NSObject[] { sendImage }, null); // 可按需排除不需要的分享渠道 activityController.ExcludedActivityTypes = new NSString[] { UIActivityType.Message, UIActivityType.Mail, UIActivityType.AirDrop }; UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(activityController, true, null); } else { // 未安装WhatsApp的提示逻辑 } } });
Xamarin.Forms 跨平台实现
可以通过依赖服务(DependencyService)封装上述两个平台的实现,统一调用接口:
- 共享项目中定义接口:
public interface IWhatsAppService { Task<bool> SendImageToContact(string fullPhoneNumber, string imagePath); }
- 分别在Android和iOS项目中实现该接口,注册依赖服务后即可在共享层直接调用。
注意事项
- 所有涉及读取通讯录、访问存储、发送消息的操作都需要先获取用户授权,符合对应平台的隐私规范要求
- WhatsApp的调用逻辑可能随着版本更新发生变化,如果出现调用失效需要对应调整参数
内容的提问来源于stack exchange,提问作者Buflow
相关产品推荐
相关产品推荐

