Flutter短信获取插件sms_retriever的使用

发布于 1周前 作者 songsunli 来自 Flutter

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, aliasfile 参数为实际值):

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

1 回复

更多关于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旨在减少这种需求)。

回到顶部