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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:07:10