Flutter短信获取插件sms_retriever的使用
Flutter短信获取插件sms_retriever的使用
插件简介
sms_retriever
是一个用于在Android平台上通过SMS Retrieval API获取短信的Flutter插件。它可以帮助开发者方便地实现短信验证码自动读取功能,提升用户体验。
开始使用
获取应用签名
要使用此插件,您需要首先获取您的应用程序签名。该签名将被用来验证来自服务器的短信内容。可以通过以下代码来获取:
String appSignature = await SmsRetriever.getAppSignature();
监听传入的短信
接下来,启动监听以等待包含特定格式的短信到来:
String smsCode = await SmsRetriver.startListening();
一旦接收到符合条件的短信,上述调用将会返回该短信的内容。通常情况下,我们会从短信中提取出验证码或其他重要信息。
停止监听
在成功处理完短信后,记得停止监听以节省资源:
SmsRetriever.stopListening();
为keystore文件生成appSignature
如果你的应用程序是通过keystore签名的,则需要根据keystore生成appSignature。你可以使用如下命令行工具(请确保替换其中的storepass
, alias
和 file
参数为实际值):
keytool -storepass storepass -alias alias -exportcert -keystore file | xxd -p | tr -d "[:space:]" | xxd -r -p | base64 | cut -c1-11
示例短信格式
为了使插件能够正确解析短信,请确保发送的短信遵循以下格式:
[#] Your example code is:
123456
appSignature
这里的123456
是你想要提取出来的验证码,而appSignature
则是前面提到的应用签名字符串。
完整示例代码
下面是一个完整的示例应用程序,展示了如何集成并使用sms_retriever
插件:
import 'package:flutter/material.dart';
import 'package:sms_retriever/sms_retriever.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _smsCode = "";
bool isListening = false;
// 从短信中提取验证码
getCode(String sms) {
if (sms != null) {
final intRegex = RegExp(r'\d+', multiLine: true);
final code = intRegex.allMatches(sms).first.group(0);
return code;
}
return "NO SMS";
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Sms retriever example app'),
backgroundColor: isListening ? Colors.green : Colors.amber,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FutureBuilder(
builder: (context, data) {
return Text('SIGNATURE: ${data.data}');
},
future: SmsRetriever.getAppSignature(),
),
Text('SMS CODE: $_smsCode \n'),
Text(
'Press the button below to start\nlistening for an incoming SMS'),
RaisedButton(
onPressed: () async {
isListening = true;
setState(() {});
String smsCode = await SmsRetriever.startListening();
_smsCode = getCode(smsCode);
isListening = false;
setState(() {});
SmsRetriever.stopListening();
},
child: Text(isListening ? "STOP" : "START"),
)
],
),
),
),
);
}
}
这段代码创建了一个简单的Flutter应用界面,用户点击按钮开始监听短信,并在接收到符合格式的短信时自动停止监听并显示提取出的验证码。
希望这些信息对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter短信获取插件sms_retriever的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter短信获取插件sms_retriever的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用sms_retriever
插件来获取短信验证码的示例代码。这个插件主要用于Android平台上的短信验证码自动读取功能。
首先,确保你已经在pubspec.yaml
文件中添加了sms_retriever
依赖:
dependencies:
flutter:
sdk: flutter
sms_retriever: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
Android配置
在Android平台使用短信检索器(SMS Retriever API)之前,你需要在AndroidManifest.xml
文件中进行一些配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<application
... >
<!-- 其他配置 -->
<!-- 添加短信接收器 -->
<receiver android:name="com.google.android.gms.auth.api.phone.SmsRetrieverApi$SmsRetrieverReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
</intent-filter>
</receiver>
<!-- 如果你的应用目标是Android 12 (API级别 31) 或更高版本,还需要添加以下权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application android:directBootAware="true" ... >
<!-- 你的其他配置 -->
</application>
</application>
<!-- 添加Google Play服务的依赖 -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</manifest>
注意:从Android 12开始,应用默认不再接收隐式广播(包括SMS_DELIVER_ACTION),因此你可能需要引导用户手动授予你的应用读取短信的权限,或者使用SMS Retriever API。
Flutter代码实现
接下来,在你的Flutter代码中实现短信验证码的获取功能:
import 'package:flutter/material.dart';
import 'package:sms_retriever/sms_retriever.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SMS Retriever Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SmsRetrieverScreen(),
);
}
}
class SmsRetrieverScreen extends StatefulWidget {
@override
_SmsRetrieverScreenState createState() => _SmsRetrieverScreenState();
}
class _SmsRetrieverScreenState extends State<SmsRetrieverScreen> {
String _otp = '';
@override
void initState() {
super.initState();
_startSmsListener();
}
@override
void dispose() {
_stopSmsListener();
super.dispose();
}
void _startSmsListener() async {
SmsRetriever().startSmsListener(
(String message) {
// 在这里处理接收到的短信内容
// 假设短信内容为 "Your OTP is 123456"
RegExp exp = RegExp(r"Your OTP is (\d{6})");
RegExpMatch? match = exp.firstMatch(message);
if (match != null && match.groupCount >= 1) {
setState(() {
_otp = match.group(1)!;
});
}
},
onError: (dynamic err) {
// 处理错误
print("Error in SMS Retriever API: $err");
},
);
}
void _stopSmsListener() {
SmsRetriever().stopSmsListener();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SMS Retriever Demo'),
),
body: Center(
child: Text(
'OTP: $_otp',
style: TextStyle(fontSize: 24),
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,它在启动时开始监听短信,并尝试从接收到的短信中提取6位数的OTP验证码。当验证码被成功提取时,它会更新UI以显示OTP。
请注意,这只是一个基本示例,实际应用中你可能需要添加更多的错误处理和边界情况处理。此外,确保你的应用已经正确处理了Android权限请求,特别是针对读取短信的权限(尽管SMS Retriever API旨在减少这种需求)。