You need to enable JavaScript to run this app. Xamarin Android 实现SMS监听与指定短信触发对应操作的技术咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 13:24:04