如何通过Flutter读取设备消息箱消息并展示?求实现流程及可用包
Flutter读取设备消息箱消息的实现方案
核心流程
- 权限申请:Android需申请
READ_SMS权限,iOS需申请短信访问权限,需在原生配置文件声明并动态向用户申请。 - 插件选型:依赖Flutter插件调用原生系统API实现消息读取(Flutter无原生消息读取能力)。
- 消息读取:通过插件API获取设备消息箱中的短信数据,可按收件箱、发件箱等维度过滤。
- 数据处理与展示:将读取到的消息解析为Flutter可处理的模型,用列表组件展示关键信息(发件人、内容、时间等)。
- 本地存储:若需存入自身应用,可结合
sqflite、hive等本地存储插件完成数据持久化。
可用Flutter插件
sms:功能全面的短信处理插件,支持Android/iOS,可读取收件箱、发件箱、草稿箱等各类消息,还能监听新短信接收事件。telephony:除短信外还支持通话记录处理,适合需要多通讯功能的场景,API设计较为完善。flutter_sms:以发送短信为主,附带基础的短信读取能力,适合需求简单的场景。
具体实现步骤(以sms插件为例)
1. 添加依赖
在pubspec.yaml中引入插件:
dependencies: sms: ^2.2.0 permission_handler: ^10.2.0 # 用于动态申请权限
2. 配置原生权限
- Android:在
android/app/src/main/AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.READ_SMS"/>
- iOS:在
ios/Runner/Info.plist中添加权限说明:
<key>NSMessagesUsageDescription</key> <string>需要读取短信权限以展示设备消息箱中的内容</string>
3. 动态申请权限
在读取消息前先获取用户授权:
import 'package:permission_handler/permission_handler.dart'; Future<bool> requestSmsPermission() async { final status = await Permission.sms.request(); return status.isGranted; }
4. 读取并展示消息
import 'package:sms/sms.dart'; import 'package:flutter/material.dart'; class SmsListScreen extends StatefulWidget { @override _SmsListScreenState createState() => _SmsListScreenState(); } class _SmsListScreenState extends State<SmsListScreen> { List<SmsMessage>? _messages; @override void initState() { super.initState(); _loadSms(); } Future<void> _loadSms() async { final hasPermission = await requestSmsPermission(); if (!hasPermission) { // 处理权限被拒的情况,比如提示用户开启权限 return; } final query = SmsQuery(); final messages = await query.getAllSms; setState(() { _messages = messages; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('设备消息箱')), body: _messages == null ? Center(child: CircularProgressIndicator()) : ListView.builder( itemCount: _messages!.length, itemBuilder: (context, index) { final msg = _messages![index]; return ListTile( title: Text(msg.address ?? '未知发件人'), subtitle: Text(msg.body ?? ''), trailing: Text(DateTime.fromMillisecondsSinceEpoch(msg.date!).toString().substring(0, 16)), ); }, ), ); } }
注意事项
- Android 10+对
READ_SMS权限限制严格,需确保动态申请流程合规,同时处理用户拒绝权限的场景。 - iOS端权限申请需提供合理的用途说明,否则可能被App Store拒审;且iOS系统对短信读取的权限管控更为严格,部分场景下可能无法读取全部消息。
- 插件兼容性需留意,优先选择维护活跃、更新及时的插件,避免因系统版本升级导致功能失效。
内容的提问来源于stack exchange,提问作者user23150486
相关产品推荐
相关产品推荐

