Flutter短信监听插件smswatcher的使用

Flutter短信监听插件smswatcher的使用

简介

A Flutter插件用于监听Android设备上的短信。该插件允许你实时接收短信更新并获取短信历史记录。

功能

  • 实时监听新收到的短信。
  • 获取存储在设备上的短信。
  • 支持Stream和Future两种数据处理方式。

安装

将以下内容添加到你的pubspec.yaml文件中:

dependencies:
  smswatcher: ^0.0.3

然后运行命令:

flutter pub get

使用方法

导入插件

在你的Dart文件中导入插件:

import 'package:smswatcher/smswatcher.dart';

初始化插件

创建一个Smswatcher实例:

final _smswatcher = Smswatcher();

监听新收到的短信

使用StreamBuilder来实时监听新收到的短信:

StreamBuilder(
  stream: _smswatcher.getStreamOfSMS(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      final sms = snapshot.data;
      return ListTile(
        title: Text(sms?["sender"] ?? "未知发送者"), // 发送者
        subtitle: Text(sms?["body"] ?? "无内容"), // 短信内容
      );
    } else {
      return Text("暂无新消息");
    }
  },
)

获取短信历史

使用FutureBuilder来获取所有已存储的短信:

FutureBuilder(
  future: _smswatcher.getAllSMS(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      final smsList = snapshot.data as List;
      return ListView.builder(
        itemCount: smsList.length,
        itemBuilder: (context, index) {
          final sms = smsList[index];
          return ListTile(
            title: Text(sms["sender"] ?? "未知发送者"), // 发送者
            subtitle: Text(sms["body"] ?? "无内容"), // 短信内容
          );
        },
      );
    } else {
      return CircularProgressIndicator(); // 加载指示器
    }
  },
)

权限

Android

确保你的AndroidManifest.xml包含以下权限以接收和读取短信:

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

对于运行时权限,可以考虑使用permission_handler插件。

问题与贡献

请通过GitHub提交问题或功能请求。欢迎贡献!


以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:smswatcher/smswatcher.dart';

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _smsListenerPlugin = Smswatcher();

  [@override](/user/override)
  void initState() {
    super.initState();
    Permission.sms.request();
  }

  [@override](/user/override)
  void dispose() {
    _smsListenerPlugin.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
        floatingActionButton: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            FloatingActionButton(
              onPressed: () {
                _smsListenerPlugin.getAllSMS();
              },
              child: const Icon(Icons.sms),
            ),
            const SizedBox(
              height: 20,
            )
          ],
        ),
        appBar: AppBar(
          title: const Text('短信获取应用'),
        ),
        body: SafeArea(
          child: SingleChildScrollView(
            child: Column(
              children: [
                SizedBox(
                  height: MediaQuery.of(context).size.height / 6,
                  child: Column(
                    children: [
                      const Text("正在监听最新消息",
                          style: TextStyle(fontWeight: FontWeight.bold)),
                      StreamBuilder(
                        stream: _smsListenerPlugin.getStreamOfSMS(),
                        builder: (context, snap) => ListTile(
                          title: Text(snap.data?["sender"] ?? "NA"),
                          subtitle: Text(snap.data?["body"] ?? "NA"),
                        ),
                      ),
                    ],
                  ),
                ),
                const Divider(height: 1),
                SizedBox(
                  height: MediaQuery.of(context).size.height / 1,
                  child: Column(
                    children: [
                      const Text("正在监听最新消息",
                          style: TextStyle(fontWeight: FontWeight.bold)),
                      FutureBuilder(
                        future: _smsListenerPlugin.getAllSMS(),
                        builder: (context, snap) {
                          if (!snap.hasData)
                            return const CircularProgressIndicator(); // 可选的加载状态
                          return Expanded(
                            child: ListView.builder(
                              itemCount: snap.data?.length ?? 0,
                              itemBuilder: (context, index) => ListTile(
                                title: Text(snap.data?[index]["sender"] ?? "NA"),
                                subtitle: Text(snap.data?[index]["body"] ?? "NA"),
                              ),
                            ),
                          );
                        },
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter短信监听插件smswatcher的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter短信监听插件smswatcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


SMSWatcher 是一个用于监听短信接收的 Flutter 插件。它允许你的 Flutter 应用在收到短信时捕获短信内容,并进行相应的处理。这个插件在需要自动读取短信验证码或其他短信内容的场景中非常有用。

安装 SMSWatcher

首先,你需要在 pubspec.yaml 文件中添加 sms_watcher 依赖:

dependencies:
  flutter:
    sdk: flutter
  sms_watcher: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

配置权限

为了监听短信,你需要在 AndroidManifest.xml 中添加以下权限:

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

基本用法

  1. 初始化 SMSWatcher

    在你的 Dart 代码中,初始化 SMSWatcher

    import 'package:sms_watcher/sms_watcher.dart';
    
    final smsWatcher = SMSWatcher();
    
  2. 监听短信

    使用 smsWatcher 来监听短信:

    smsWatcher.onSmsReceived.listen((SmsMessage sms) {
      print('Received SMS: ${sms.body}');
      print('From: ${sms.sender}');
      print('Timestamp: ${sms.timestamp}');
    });
    

    SmsMessage 类通常包含以下属性:

    • body: 短信内容
    • sender: 发送者号码
    • timestamp: 短信接收时间戳
  3. 请求权限

    在 Android 6.0 及以上版本,你需要在运行时请求短信读取权限:

    import 'package:permission_handler/permission_handler.dart';
    
    Future<void> requestSMSPermission() async {
      if (await Permission.sms.request().isGranted) {
        // 权限已授予
      } else {
        // 权限被拒绝
      }
    }
    

    确保在 pubspec.yaml 中添加 permission_handler 依赖:

    dependencies:
      permission_handler: ^10.0.0  # 请检查最新版本
    
  4. 停止监听

    你可以通过调用 dispose 方法来停止监听短信:

    smsWatcher.dispose();
    

注意事项

  • Android 专用: SMSWatcher 主要是为 Android 设备设计的,不支持 iOS。在 iOS 上,由于系统限制,应用无法直接访问短信内容。
  • 权限问题: 确保在适当的时机请求并获取短信读取权限,否则无法正常监听短信。
  • 后台监听: 在某些 Android 版本或设备上,后台监听短信可能会受到限制或无法正常工作。

示例代码

以下是一个完整的示例代码,展示如何使用 SMSWatcher 来监听短信:

import 'package:flutter/material.dart';
import 'package:sms_watcher/sms_watcher.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SMSWatcherExample(),
    );
  }
}

class SMSWatcherExample extends StatefulWidget {
  [@override](/user/override)
  _SMSWatcherExampleState createState() => _SMSWatcherExampleState();
}

class _SMSWatcherExampleState extends State<SMSWatcherExample> {
  final smsWatcher = SMSWatcher();
  String smsContent = 'No SMS received yet.';

  [@override](/user/override)
  void initState() {
    super.initState();
    requestSMSPermission();
    smsWatcher.onSmsReceived.listen((SmsMessage sms) {
      setState(() {
        smsContent = 'Received SMS: ${sms.body}\nFrom: ${sms.sender}';
      });
    });
  }

  Future<void> requestSMSPermission() async {
    if (await Permission.sms.request().isGranted) {
      // 权限已授予
    } else {
      // 权限被拒绝
    }
  }

  [@override](/user/override)
  void dispose() {
    smsWatcher.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SMS Watcher Example'),
      ),
      body: Center(
        child: Text(smsContent),
      ),
    );
  }
}
回到顶部