如何在Flutter中实现收到新短信时自动弹出Toast提示的功能
Flutter 实现接收新短信自动弹出Toast的方案
注意:受iOS系统隐私限制,第三方应用无法读取短信内容,以下方案仅支持安卓平台
1. 权限配置
- 首先在安卓项目的
android/app/src/main/AndroidManifest.xml中添加权限声明,放在manifest标签下、application标签外:
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- 安卓13及以上版本额外需要的权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 动态申请权限,推荐使用
permission_handler库处理权限逻辑,避免自己写原生适配代码:
import 'package:permission_handler/permission_handler.dart'; Future<bool> requestSmsPermission() async { final smsStatus = await Permission.sms.request(); final notificationStatus = await Permission.postNotifications.request(); return smsStatus.isGranted && notificationStatus.isGranted; }
2. 核心功能实现
- 先在
pubspec.yaml添加依赖:
dependencies: flutter: sdk: flutter permission_handler: ^11.0.1 sms_advanced: ^1.2.0 fluttertoast: ^8.2.4
- 短信监听+Toast弹出的完整代码:
import 'package:flutter/material.dart'; import 'package:sms_advanced/sms_advanced.dart'; import 'package:fluttertoast/fluttertoast.dart'; class SmsListenerPage extends StatefulWidget { const SmsListenerPage({super.key}); @override State<SmsListenerPage> createState() => _SmsListenerPageState(); } class _SmsListenerPageState extends State<SmsListenerPage> { late SmsReceiver _smsReceiver; @override void initState() { super.initState(); _initSmsListener(); } Future<void> _initSmsListener() async { final hasPermission = await requestSmsPermission(); if (!hasPermission) return; _smsReceiver = SmsReceiver(); _smsReceiver.onSmsReceived?.listen((SmsMessage message) { Fluttertoast.showToast( msg: "新短信来自:${message.address}\n内容:${message.body}", toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.CENTER, fontSize: 14, ); }); } @override void dispose() { _smsReceiver.stopListening(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold(appBar: AppBar(title: const Text("短信监听"))); } }
3. 兼容注意事项
- 安卓10及以上系统禁止应用在后台弹出界面,部分定制ROM(小米、华为等)需要手动给应用开启「后台弹出界面」「自启动」权限,否则应用退到后台后无法收到短信广播
- 如果需要应用被杀死后仍能触发提醒,需要额外实现安卓原生保活逻辑,不同厂商ROM的保活配置差异较大
内容的提问来源于stack exchange,提问作者Zu Haib
相关产品推荐
相关产品推荐

