Xamarin Android 实现SMS监听与指定短信触发对应操作的技术咨询
Xamarin Android 短信监听与触发规则实现方案
1. 前置权限配置
- 在
Properties/AndroidManifest.xml中添加以下权限声明(也可通过项目属性的Android清单可视化配置):<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.SEND_SMS" /> - 动态权限申请:Android 6.0(API 23)以上需主动申请危险权限,可在启动页添加如下申请逻辑:
var permissions = new string[] { Manifest.Permission.ReceiveSms, Manifest.Permission.ReadSms, Manifest.Permission.AccessFineLocation, Manifest.Permission.SendSms }; RequestPermissions(permissions, 1001);
2. 短信接收广播接收器实现
Xamarin中通过继承BroadcastReceiver实现短信监听,代码示例如下:
[BroadcastReceiver(Enabled = true, Exported = true)] [IntentFilter(new[] { Telephony.Sms.Intents.SmsReceivedAction }, Priority = (int)ApplicationPriority.High)] public class SmsListenerReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { var messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent); if (messages == null || messages.Length == 0) return; StringBuilder fullSmsContent = new StringBuilder(); string senderNumber = messages[0].DisplayOriginatingAddress; // 需校验发送方时可在此处理 foreach (var msg in messages) { fullSmsContent.Append(msg.DisplayMessageBody); } string content = fullSmsContent.ToString().Trim(); FilterAndExecuteLogic(context, content); } private void FilterAndExecuteLogic(Context context, string smsContent) { // 规则匹配:精准匹配「手机丢失」内容 // 如需兼容包含额外内容的触发短信,可将Equals替换为Contains if (smsContent.Equals("手机丢失")) { // 调用预设逻辑:获取当前位置并发送到指定备用号码 // 注意:OnReceive运行在主线程,仅允许执行轻量操作 // 定位、SMS发送等耗时逻辑必须移交前台服务处理,避免ANR var serviceIntent = new Intent(context, typeof(LocationSendService)); serviceIntent.PutExtra("targetNumber", "你的备用手机号"); if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O) { context.StartForegroundService(serviceIntent); } else { context.StartService(serviceIntent); } // 需阻止系统短信应用接收该广播时,取消下行注释即可 // AbortBroadcast(); } } }
3. 适配注意事项
- 广播优先级设置为较高值可保证优先于普通短信应用收到有序广播;需更高优先级可将应用设置为系统默认短信应用。
- 长短信会被拆分为多个分段接收,必须拼接所有分段内容后再做规则匹配,避免触发失效。
- 广播接收器的执行时长限制为10秒,超时会被系统判定为无响应,所有耗时操作必须移交前台服务处理。
SMS_RECEIVED属于系统白名单隐式广播,Android 8.0以上可正常静态注册,应用未启动时也可接收短信。
内容的提问来源于stack exchange,提问作者Mohammad Mahdi
相关产品推荐
相关产品推荐

