Flutter短信功能插件sms_plugin_mp的使用

Flutter短信功能插件sms_plugin_mp的使用


简介

这是一个用于Flutter的短信库。


开始使用

安装和使用

首先,你需要在pubspec.yaml文件的依赖列表中添加sms_plugin_mp(版本0.0.3或更高):

dependencies:
  flutter:
    sdk: flutter

  sms_plugin_mp: ^0.0.3

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


查询短信消息

导入sms_plugin_mp并创建一个SmsQuery类的实例:

import 'package:sms_plugin_mp/sms_plugin.dart';

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

获取所有短信消息

List<SmsMessage> messages = await query.getAllSms;

注意: 使用await关键字意味着getAllSms方法是异步解析的,并返回一个Future。要使用await,你必须在一个标记为async的函数中。


过滤短信消息

SmsQuery类中的querySms方法返回与提供的参数匹配的过滤后的短信消息列表。例如,查询所有发送和接收的短信消息,可以使用以下代码:

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

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

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

获取所有线程对话

使用SmsQuery还可以获取整个对话列表:

List<SmsThread> threads = await query.getAllThreads;

提取信息

List<SmsThread> threads = await query.getAllThreads;
for( var index = num ; index >= threads.length; index-- ) { 
     String sendernumber = threads[index].contact?.address;
     String sim = threads[index].messages.first.sim.toString();
     String message = threads[index].messages.first.body;
     print('sender number: $sendernumber');
     print('reciever sim: $sim');
     print('message: $message');
} 

获取联系人信息

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

import 'package:sms_plugin_mp/contact.dart';

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

查询联系人

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

import 'package:sms_plugin_mp/contact.dart';

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

获取联系人照片

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

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

获取用户信息

有时请求手机所有者的基本信息(如联系人照片、地址等)是有用的:

import 'package:sms_plugin_mp/contact.dart';

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

发送短信

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

import 'package:sms_plugin_mp/sms_plugin.dart';

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

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

import 'package:sms_plugin_mp/sms_plugin.dart';

void main() {
  SmsSender sender = new SmsSender();
  String address = someAddress();
  ...
  SmsMessage message = new SmsMessage(address, 'Hello flutter world!');
  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_plugin_mp/sms_plugin.dart';

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

删除短信

目前只支持逐个删除。别忘了让你的短信应用成为默认短信应用。

import 'package:sms_plugin_mp/sms_plugin.dart';

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

Android集成

活动更改

注意,sms_plugin_mp需要使用FragmentActivity而不是Activity。要更新你的应用:

  • 如果你直接使用FlutterActivity,将其更改为AndroidManifest.xml中的FlutterFragmentActivity
  • 如果你使用的是自定义活动,请更新你的MainActivity.java
import io.flutter.embedding.android.FlutterFragmentActivity;

public class MainActivity extends FlutterFragmentActivity {
    // ...
}

或者MainActivity.kt:

import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity: FlutterFragmentActivity() {
    // ...
}

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

1 回复

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


在Flutter中,sms_plugin_mp 是一个用于发送和接收短信的插件,特别是在多平台(如iOS和Android)开发中非常有用。以下是如何在Flutter项目中集成和使用 sms_plugin_mp 插件的一个基本示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  sms_plugin_mp: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

2. 导入插件

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

import 'package:sms_plugin_mp/sms_plugin_mp.dart';

3. 配置权限

Android

android/app/src/main/AndroidManifest.xml 文件中添加短信发送和接收权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

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

    <application
        ... >
        <!-- 其他配置 -->
    </application>
</manifest>

iOS

对于iOS,你需要在 Info.plist 文件中添加权限请求描述。打开 ios/Runner/Info.plist 并添加以下条目:

<key>NSMessageUsageDescription</key>
<string>This app needs access to send and receive SMS messages.</string>

4. 请求权限(可选)

在发送短信前,你可能需要请求用户授予权限。这里是一个简单的权限请求示例:

Future<void> requestSmsPermissions() async {
  bool hasPermission = await SmsPluginMp.hasSendSmsPermission;
  if (!hasPermission) {
    bool permissionGranted = await SmsPluginMp.requestSendSmsPermission;
    if (!permissionGranted) {
      // 处理权限被拒绝的情况
    }
  }
}

5. 发送短信

使用 SmsPluginMp 发送短信:

Future<void> sendSms(String phoneNumber, String message) async {
  try {
    bool success = await SmsPluginMp.sendSms(
      phoneNumber: phoneNumber,
      message: message,
    );
    if (success) {
      print("SMS sent successfully!");
    } else {
      print("Failed to send SMS.");
    }
  } catch (e) {
    print("Error sending SMS: $e");
  }
}

6. 监听短信(仅适用于Android,iOS需要额外配置)

由于监听短信涉及更多安全和隐私考虑,这里仅提供一个基本的监听注册示例,具体实现需根据平台文档进行:

void listenForIncomingSms() {
  SmsPluginMp.smsReceivedStream.listen((SmsMessage message) {
    print("Received SMS: ${message.body} from ${message.address}");
  });
}

注意:监听短信在iOS上可能受到严格限制,通常需要使用特定的API和权限,且用户必须明确授予访问权限。

完整示例

以下是一个完整的示例,将上述所有步骤整合在一起:

import 'package:flutter/material.dart';
import 'package:sms_plugin_mp/sms_plugin_mp.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    requestSmsPermissions();
    listenForIncomingSms();
  }

  Future<void> requestSmsPermissions() async {
    bool hasPermission = await SmsPluginMp.hasSendSmsPermission;
    if (!hasPermission) {
      bool permissionGranted = await SmsPluginMp.requestSendSmsPermission;
      if (!permissionGranted) {
        // Handle permission denied
      }
    }
  }

  void listenForIncomingSms() {
    SmsPluginMp.smsReceivedStream.listen((SmsMessage message) {
      print("Received SMS: ${message.body} from ${message.address}");
    });
  }

  Future<void> _sendSms() async {
    String phoneNumber = '+1234567890'; // 替换为实际电话号码
    String message = 'Hello, this is a test SMS!';
    try {
      bool success = await SmsPluginMp.sendSms(
        phoneNumber: phoneNumber,
        message: message,
      );
      if (success) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('SMS sent successfully!')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to send SMS.')),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error sending SMS: $e')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SMS Plugin Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _sendSms,
            child: Text('Send SMS'),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何集成 sms_plugin_mp 插件,请求发送短信权限,发送短信,以及监听收到的短信(在支持的平台上)。请确保在实际应用中处理所有可能的错误和异常情况,并根据需要调整权限请求和用户体验。

回到顶部