如何在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
相关产品推荐
相关产品推荐

