You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中接收SMS并触发Flutter界面更新?

实现Kotlin接收短信并同步更新Flutter UI

1. Android端(Kotlin)配置与短信监听实现

1.1 添加权限声明

在AndroidManifest.xml中添加短信相关权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />

1.2 实现短信广播接收器

创建广播接收器类,用于捕获短信接收事件并传递内容:

class SmsReceiver : BroadcastReceiver() {
    private var smsCallback: ((String) -> Unit)? = null

    fun attachCallback(callback: (String) -> Unit) {
        smsCallback = callback
    }

    fun detachCallback() {
        smsCallback = null
    }

    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Telephony.Sms.Intents.SMS_RECEIVED_ACTION) {
            val smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent)
            val contentBuilder = StringBuilder()
            for (sms in smsMessages) {
                contentBuilder.append("发件人: ${sms.displayOriginatingAddress}\n")
                contentBuilder.append("内容: ${sms.displayMessageBody}\n\n")
            }
            smsCallback?.invoke(contentBuilder.toString())
        }
    }
}

1.3 配置EventChannel与注册接收器

在MainActivity中完成广播注册、权限申请,并通过EventChannel建立与Flutter的事件流通信:

class MainActivity : FlutterActivity() {
    private val SMS_EVENT_CHANNEL = "your.package.name/sms_events"
    private lateinit var smsReceiver: SmsReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        smsReceiver = SmsReceiver()

        // 动态注册短信广播接收器
        val smsFilter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
        smsFilter.priority = 999
        registerReceiver(smsReceiver, smsFilter)

        // 初始化EventChannel,实现事件流推送
        EventChannel(flutterEngine?.dartExecutor?.binaryMessenger, SMS_EVENT_CHANNEL).setStreamHandler(
            object : EventChannel.StreamHandler {
                override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                    smsReceiver.attachCallback { smsContent ->
                        events?.success(smsContent)
                    }
                }

                override fun onCancel(arguments: Any?) {
                    smsReceiver.detachCallback()
                }
            }
        )

        // 动态申请短信权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS),
                1001
            )
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(smsReceiver)
    }
}

2. Flutter端监听事件并更新UI

使用StatefulWidget监听EventChannel的事件流,收到短信内容后触发UI更新:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class SmsMonitorPage extends StatefulWidget {
  const SmsMonitorPage({super.key});

  @override
  State<SmsMonitorPage> createState() => _SmsMonitorPageState();
}

class _SmsMonitorPageState extends State<SmsMonitorPage> {
  final EventChannel _smsChannel = const EventChannel('your.package.name/sms_events');
  String _smsContent = "等待接收短信...";

  @override
  void initState() {
    super.initState();
    _startSmsListening();
  }

  void _startSmsListening() {
    _smsChannel.receiveBroadcastStream().listen(
      (data) {
        setState(() {
          _smsContent = data as String;
        });
      },
      onError: (error) {
        setState(() {
          _smsContent = "接收失败: $error";
        });
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("短信实时监听")),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Text(_smsContent, style: const TextStyle(fontSize: 16)),
      ),
    );
  }
}

3. 关键注意事项

  • 权限校验:Android 6.0+必须动态申请短信权限,未授权时广播接收器无法工作。
  • 后台限制:若需App在后台接收短信,需配置前台服务,避免系统因后台休眠阻断广播。
  • 广播优先级:设置合理的广播优先级(不超过1000),确保能优先捕获短信事件。
  • 机型兼容性:部分厂商对短信广播有自定义拦截逻辑,需针对主流机型测试适配。

内容的提问来源于stack exchange,提问作者Mza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:25:22