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);
}
注意:使用SmsSender
的onSmsDelivered
只会通知通过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
更多关于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"),
),
],
),
),
);
}
}