Flutter短信管理插件sms_maintained的使用

Flutter短信管理插件sms_maintained的使用

项目维护状态

该项目由原来的拥有者接手,因为后者不再维护它。GitHub

Flutter SMS

这是一个为Flutter设计的短信库。

目前仅支持Android平台。iOS和MMS不在本项目的范围之内。

额外信息

我已fork了此仓库,以便改进并添加自己的功能。

入门指南

对于如何开始使用Flutter,可以查看我们的在线文档: Flutter官方文档

若要了解如何编辑插件代码,可查阅以下文档: Flutter平台插件编辑指南

安装与使用

熟悉Flutter后,可以通过在pubspec.yaml文件的依赖项列表中添加sms(版本号0.1.4或更高)来安装此包:

dependencies:
  flutter:
    sdk: flutter

  sms: ^0.2.0

然后在控制台运行命令flutter packages get

查询短信消息

首先,导入sms包并创建一个SmsQuery类的实例:

import 'package:sms/sms.dart';

void main() {
  SmsQuery query = new SmsQuery();
}

获取所有短信消息

通过调用getAllSms方法获取所有短信消息:

List<SmsMessage> messages = await query.getAllSms;

注意:使用await关键字表示getAllSms是异步执行的,并返回一个Future。

筛选短信消息

SmsQuery类中的querySms方法可以根据提供的参数返回符合条件的短信列表。例如,查询所有发送和接收的短信:

await query.querySms({
    kinds: [SmsQueryKind.Inbox, SmsQueryKind.Sent]
});

你也可以查询特定联系人发送和接收的所有短信:

await query.querySms({
    address: getContactAddress()
});

获取所有会话线程

通过SmsQuery还可以获取所有会话线程:

List<SmsThread> threads = await query.getAllThreads;

获取联系人信息

每个会话线程都关联一个联系人。 Contact类包含线程联系人的所有信息(地址、照片、全名)。 要访问Contact类,必须在Dart文件中导入'package:sms/contact.dart'

import 'package:sms/contact.dart';

void main() {
  ...
  Contact contact = threads.first.contact;
  print(contact.address);
}

查询联系人

你还可以通过联系人的地址(电话号码)查询联系人信息:

import 'package:sms/contact.dart';

void main() {
  ContactQuery contacts = new ContactQuery();
  Contact contact = await contacts.queryContact(someAddress());
  print(contact.fullName);
}
String getAddress() {...}

联系人照片

你可以检索联系人的照片(全尺寸或缩略图):

...
Uint8List fullSize = contact.photo.bytes;
Uint8List thumbnail = contact.thumbnail.bytes;

用户资料

有时需要请求手机主人的基本信息,如联系人照片、地址等。

import 'package:sms/contact.dart';

UserProfileProvider provider = new UserProfileProvider();
UserProfile profile = await provider.getUserProfile();
print(profile.fullName);

发送短信

要发送短信,只需创建一个SmsSender类的实例:

import 'package:sms/sms.dart';

void main() {
  SmsSender sender = new SmsSender();
  String address = someAddress();
  ...
  sender.sendSms(new SmsMessage(address, 'Hello flutter!'));
}

为了在消息发送和/或送达时收到通知,必须为消息添加监听器:

import 'package:sms/sms.dart';

void main() {
  SmsSender sender = new SmsSender();
  String address = someAddress();
  ...
  SmsMessage message = new SmsMessage(address, 'Hello flutter!');
  message.onStateChanged.listen((state) {
    if (state == SmsMessageState.Sent) {
      print("SMS is sent!");
    } else if (state == SmsMessageState.Delivered) {
      print("SMS is delivered!");
    }
  });
  sender.sendSms(message);
}

有时需要在消息送达时得到通知,而不管具体是哪条消息。为此,必须订阅SmsSender实例的onSmsDelivered

void main() {
  ...
  SmsSender sender = new SmsSender();
  sender.onSmsDelivered.listen((SmsMessage message){
    print('${message.address} received your message.');
  });
}

你还可以使用另一张SIM卡发送短信:

void main() {
  SimCardsProvider provider = new SimCardsProvider();
  SimCard card = await provider.getSimCards()[0];
  SmsSender sender = new SmsSender();
  SmsMessage message = new SmsMessage("address", "message");
  sender.sendSMS(message, simCard: card);
}

注意:使用SmsSenderonSmsDelivered只会通知通过SmsSender.send()发送的消息。

接收短信

如果想被通知有新短信到达,必须订阅SmsReceiver类的一个实例:

import 'package:sms/sms.dart';

void main() {
  SmsReceiver receiver = new SmsReceiver();
  receiver.onSmsReceived.listen((SmsMessage msg) => print(msg.body));
}

删除短信

目前只能逐条删除短信:

SmsRemover smsRemover = SmsRemover();
bool value = await smsRemover.removeSmsById(sms.id, _smsThread.threadId);

路线图

  • ✅ SMS接收器
  • ✅ SMS发送器
  • ✅ SMS投递
  • ✅ SMS查询
  • ✅ SMS删除
  • ✅ SMS线程
  • ✅ 联系人
  • ✅ 联系人照片(全尺寸、缩略图)
  • ✅ 用户资料(基本信息)
  • ❌ 提高性能。
  • ❌ 添加缓存层。
  • ❌ 添加助手。
  • ❌ 添加观察者,这样就不需要手动轮询更改。
  • ❌ …

MMS和iOS不在本项目的范围内。如果有人愿意添加代码并发起合并请求,我很乐意将其包含进来。

如果有需求,随时可以提出问题。我会尽力解决。

贡献者

应用程序Logo

设计和创建由 Imrul kayes 完成。

贡献

任何贡献都是受欢迎的。

捐赠

作为一名学生,资金并不充裕。如果您愿意,可以进行捐赠。 PayPal


完整示例代码

以下是一个完整的示例代码,展示如何使用sms_maintained插件查询、发送和接收短信。

import 'package:flutter/material.dart';
import 'package:sms/sms.dart';
import 'package:sms/contact.dart';
import 'package:sms/user_profile.dart';

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

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

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

class _HomeScreenState extends State<HomeScreen> {
  List<SmsMessage> _messages = [];
  String _statusText = "等待操作...";

  void _queryAllSms() async {
    SmsQuery query = new SmsQuery();
    List<SmsMessage> messages = await query.getAllSms;
    setState(() {
      _messages = messages;
      _statusText = "已加载${_messages.length}条短信";
    });
  }

  void _sendSms(String address) async {
    SmsSender sender = new SmsSender();
    SmsMessage message = new SmsMessage(address, 'Hello from Flutter!');
    message.onStateChanged.listen((state) {
      if (state == SmsMessageState.Sent) {
        setState(() {
          _statusText = "短信已发送!";
        });
      } else if (state == SmsMessageState.Delivered) {
        setState(() {
          _statusText = "短信已送达!";
        });
      }
    });
    sender.sendSms(message);
  }

  void _receiveSms() async {
    SmsReceiver receiver = new SmsReceiver();
    receiver.onSmsReceived.listen((SmsMessage msg) {
      setState(() {
        _statusText = "接收到短信: ${msg.body}";
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SMS管理示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _queryAllSms,
              child: Text('查询所有短信'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () => _sendSms("1234567890"),
              child: Text('发送短信'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _receiveSms,
              child: Text('开始接收短信'),
            ),
            SizedBox(height: 20),
            Text(_statusText),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


sms_maintained 是一个用于在 Flutter 应用中管理短信的插件。它允许你发送短信、读取短信、查询短信等操作。以下是如何使用 sms_maintained 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sms_maintained: ^0.2.6

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

2. 配置权限

为了读取和发送短信,你需要在 AndroidManifest.xml 文件中添加以下权限:

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

3. 请求权限

在 Android 6.0(API 23)及以上版本中,你需要在运行时请求权限。你可以使用 permission_handler 插件来请求权限。

首先,添加 permission_handler 依赖:

dependencies:
  permission_handler: ^10.0.0

然后,在代码中请求权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermissions() async {
  var status = await Permission.sms.status;
  if (!status.isGranted) {
    await Permission.sms.request();
  }
}

4. 使用 sms_maintained 插件

以下是一些常见的使用示例:

发送短信

import 'package:sms_maintained/sms.dart';

void sendSms() async {
  SmsSender sender = SmsSender();
  String address = "1234567890"; // 接收者的电话号码
  String message = "Hello, this is a test message!"; // 短信内容

  sender.sendSms(SmsMessage(address, message));
}

读取短信

import 'package:sms_maintained/sms.dart';

void readSms() async {
  SmsQuery query = SmsQuery();
  List<SmsMessage> messages = await query.getAllSms;

  for (var message in messages) {
    print("Sender: ${message.address}, Body: ${message.body}");
  }
}

监听收到的短信

import 'package:sms_maintained/sms.dart';

void listenForSms() {
  SmsReceiver receiver = SmsReceiver();
  receiver.onSmsReceived.listen((SmsMessage message) {
    print("New SMS received: ${message.body}");
  });
}

5. 处理错误和异常

在实际使用中,你可能会遇到权限被拒绝、短信发送失败等情况。因此,建议在使用这些功能时添加错误处理逻辑。

void sendSms() async {
  SmsSender sender = SmsSender();
  String address = "1234567890";
  String message = "Hello, this is a test message!";

  try {
    await sender.sendSms(SmsMessage(address, message));
    print("SMS sent successfully");
  } catch (e) {
    print("Failed to send SMS: $e");
  }
}

6. 注意事项

  • iOS 支持sms_maintained 插件在 iOS 上的支持有限,因为 iOS 对短信的访问有严格的限制。通常,你只能使用插件来发送短信,而不能读取或监听短信。
  • 权限管理:确保在请求权限时处理用户拒绝权限的情况,并提供适当的反馈或引导用户手动开启权限。

7. 完整示例

以下是一个完整的示例,展示了如何发送短信、读取短信和监听收到的短信:

import 'package:flutter/material.dart';
import 'package:sms_maintained/sms.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: SmsExample(),
    );
  }
}

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

class _SmsExampleState extends State<SmsExample> {
  [@override](/user/override)
  void initState() {
    super.initState();
    requestPermissions();
    listenForSms();
  }

  Future<void> requestPermissions() async {
    var status = await Permission.sms.status;
    if (!status.isGranted) {
      await Permission.sms.request();
    }
  }

  void listenForSms() {
    SmsReceiver receiver = SmsReceiver();
    receiver.onSmsReceived.listen((SmsMessage message) {
      print("New SMS received: ${message.body}");
    });
  }

  void sendSms() async {
    SmsSender sender = SmsSender();
    String address = "1234567890";
    String message = "Hello, this is a test message!";

    try {
      await sender.sendSms(SmsMessage(address, message));
      print("SMS sent successfully");
    } catch (e) {
      print("Failed to send SMS: $e");
    }
  }

  void readSms() async {
    SmsQuery query = SmsQuery();
    List<SmsMessage> messages = await query.getAllSms;

    for (var message in messages) {
      print("Sender: ${message.address}, Body: ${message.body}");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("SMS Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: sendSms,
              child: Text("Send SMS"),
            ),
            ElevatedButton(
              onPressed: readSms,
              child: Text("Read SMS"),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部