Flutter短信接收插件sms_receiver的使用
Flutter短信接收插件sms_receiver的使用
sms_receiver
是一个用于读取传入且预期的SMS消息的Flutter插件。需要注意的是,该插件主要为Android平台开发,可以在不请求SMS权限的情况下读取消息。
注意事项
- 由于Flutter的某些更新,此插件可能不再需要,请参考flutter/flutter#13015。
- 插件版本:pub.dev/packages/sms_receiver
使用步骤
生成可接受的消息格式
不要在运行时使用 AppSignatureHelper
生成哈希消息。将哈希作为常量存储在你的应用程序中,无论是服务器端还是客户端。
添加依赖
首先,在你的 pubspec.yaml
文件中添加 sms_receiver
依赖:
dependencies:
sms_receiver: ^0.4.2
创建并使用 SmsReceiver 实例
以下是一个完整的示例Demo:
import 'package:flutter/material.dart';
import 'package:sms_receiver/sms_receiver.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? _textContent = 'Waiting for messages...';
SmsReceiver? _smsReceiver;
@override
void initState() {
super.initState();
// 初始化SmsReceiver实例,并设置消息接收和超时处理函数
_smsReceiver = SmsReceiver(onSmsReceived, onTimeout: onTimeout);
_startListening(); // 开始监听
}
// 当接收到消息时调用
void onSmsReceived(String? message) {
setState(() {
_textContent = message;
});
}
// 超时时调用
void onTimeout() {
setState(() {
_textContent = 'Timeout!!!';
});
}
// 开始监听短信
void _startListening() async {
if (_smsReceiver == null) return;
await _smsReceiver?.startListening();
setState(() {
_textContent = 'Waiting for messages...';
});
}
// 停止监听短信
void _stopListening() async {
if (_smsReceiver == null) return;
await _smsReceiver?.stopListening();
setState(() {
_textContent = 'Listener Stopped';
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('SMS Listener App'),
),
body: Column(
children: <Widget>[
Container(
padding: const EdgeInsets.symmetric(vertical: 16.0),
alignment: Alignment.center,
child: Text(_textContent ?? 'empty'),
),
ElevatedButton(
child: const Text('Listen Again'),
onPressed: _startListening,
),
ElevatedButton(
child: const Text('Stop Listener'),
onPressed: _stopListening,
),
],
),
),
);
}
}
关键点
- 接收器超时:接收器的超时时间为5分钟,目前不可配置。
- 重新启动监听:一旦接收到短信或接收器超时,请再次调用
startListening()
方法以继续监听新的短信。
通过上述步骤和代码示例,你应该能够在你的Flutter应用中成功集成并使用 sms_receiver
插件来监听短信。
更多关于Flutter短信接收插件sms_receiver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter短信接收插件sms_receiver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用sms_receiver
插件来接收短信的一个基本示例。sms_receiver
插件允许你的Flutter应用监听并接收短信。需要注意的是,接收短信通常需要设备的特定权限,并且可能受限于操作系统的安全和隐私策略。
步骤 1: 添加依赖
首先,你需要在pubspec.yaml
文件中添加sms_receiver
依赖:
dependencies:
flutter:
sdk: flutter
sms_receiver: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
步骤 2: 配置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.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<application
...>
<!-- Add the receiver for SMS -->
<receiver android:name=".SmsReceiver" android:exported="true" android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
注意:SmsReceiver
是我们在下一步中将要创建的类。
步骤 3: 创建SmsReceiver类
在android/app/src/main/kotlin/com/example/yourapp/
(或者java/com/example/yourapp/
如果你使用的是Java)目录下创建一个名为SmsReceiver.kt
(或SmsReceiver.java
)的文件,并添加以下代码:
SmsReceiver.kt:
package com.example.yourapp
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.SmsMessage
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class SmsReceiver : BroadcastReceiver() {
companion object {
private const val CHANNEL = "com.example.yourapp/sms"
}
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == "android.provider.Telephony.SMS_RECEIVED") {
val extras = intent.extras
val pdus = extras?.get("pdus") as? Array<ByteArray>
for (i in pdus?.indices ?: emptyList()) {
val sms = SmsMessage.createFromPdu(pdus[i])
val messageBody = sms.messageBody.toString()
val phoneNumber = sms.originatingAddress
// 获取FlutterEngine实例(这里需要你的应用逻辑来确保FlutterEngine是可用的)
// 假设你已经有一个全局的FlutterEngine实例
val flutterEngine: FlutterEngine? = ... // TODO: 获取你的FlutterEngine实例
flutterEngine?.dartExecutor?.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
val channel = MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CHANNEL)
channel.invokeMethod("smsReceived", mapOf(
"phoneNumber" to phoneNumber,
"message" to messageBody
))
}
}
}
}
注意:在实际应用中,你需要确保FlutterEngine
实例是可用的。这通常涉及到在FlutterActivity或FlutterFragment中管理FlutterEngine
的生命周期。由于这超出了简单示例的范围,你可能需要根据你的应用架构来调整这部分代码。
步骤 4: 在Flutter中监听短信
在你的Flutter应用中,你可以使用MethodChannel
来监听从原生Android代码发送的短信数据。在lib/
目录下创建一个Dart文件(例如sms_listener.dart
),并添加以下代码:
import 'package:flutter/services.dart';
class SmsListener {
static const MethodChannel _channel = MethodChannel('com.example.yourapp/sms');
static Function(String phoneNumber, String message)? _onSmsReceived;
static void listen(Function(String phoneNumber, String message) onSmsReceived) {
_onSmsReceived = onSmsReceived;
_channel.setMethodCallHandler((MethodCall call) async {
if (call.method == 'smsReceived') {
final Map<String, dynamic> arguments = call.arguments as Map<String, dynamic>;
final String phoneNumber = arguments['phoneNumber'] as String;
final String message = arguments['message'] as String;
_onSmsReceived!(phoneNumber, message);
}
});
}
}
然后,在你的主应用代码中调用这个监听器:
import 'package:flutter/material.dart';
import 'sms_listener.dart';
void main() {
SmsListener.listen((phoneNumber, message) {
print("Received SMS from $phoneNumber: $message");
});
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SMS Receiver Demo'),
),
body: Center(
child: Text('Waiting for SMS...'),
),
),
);
}
}
总结
以上代码展示了如何在Flutter应用中使用sms_receiver
插件(尽管实际上并没有一个直接名为sms_receiver
的官方Flutter插件,上述代码示例基于自定义实现)来接收短信。由于接收短信涉及到原生代码和权限管理,因此这个过程相对复杂。在实际应用中,你可能需要处理更多的边缘情况和错误处理。