Flutter短信验证码自动填充插件sms_consent_for_otp_autofill的使用

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

Flutter短信验证码自动填充插件 sms_consent_for_otp_autofill 的使用

简介

sms_consent_for_otp_autofill 是一个用于自动填充OTP(一次性密码)的Flutter插件。它利用Android的SMS用户同意API来检索单条短信中的OTP,前提是用户授予了权限。该插件不需要在manifest中声明任何权限,并且仅适用于Android设备。iOS设备可以使用其他方式实现类似功能。

截图

Screenshot 1 Screenshot 2 Screenshot 3

使用步骤

1. 创建实例

你可以选择性地提供电话号码监听器和短信监听器:

import 'package:sms_consent_for_otp_autofill/sms_consent_for_otp_autofill.dart';

SmsConsentForOtpAutofill smsConsentForOtpAutoFill = SmsConsentForOtpAutofill(
    phoneNumberListener: (number) {
      // 当用户选择一个电话号码时执行的操作
    },
    smsListener: (otpcode) {
      // 当用户接收到短信时执行的操作
    }
);

2a. 请求用户的电话号码(可选)

smsConsentForOtpAutoFill.requestPhoneNumber();

获取到的电话号码可以通过以下方式访问:

String? selectedNumber = smsConsentForOtpAutoFill.selectedPhoneNumber;

2b. 请求接收短信(可选)

smsConsentForOtpAutoFill.requestSms(); 
// 或者指定发送方的电话号码
smsConsentForOtpAutoFill.requestSms(senderPhoneNumber: sender_number);

当用户点击“允许”并接收到短信后,可以通过以下方式访问:

String? receivedSms = smsConsentForOtpAutoFill.receivedSms;

3. 最后,销毁实例

smsConsentForOtpAutoFill.dispose();

注意事项

根据SMS用户同意API的要求,只有满足以下条件的短信才能被插件接收:

  • 短信包含6到10位数字。
  • 短信由不在用户联系人列表中的电话号码发送。
  • 如果指定了发送方的电话号码,则短信必须由该号码发送。

示例代码

下面是一个完整的示例demo,展示了如何使用sms_consent_for_otp_autofill插件来自动填充OTP:

import 'package:flutter/material.dart';
import 'package:otp_text_field/otp_field.dart';
import 'package:otp_text_field/style.dart';
import 'package:sms_consent_for_otp_autofill/sms_consent_for_otp_autofill.dart';

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

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

class _MyAppState extends State<MyApp> {
  late SmsConsentForOtpAutofill smsConsentForOtpAutoFill;
  OtpFieldController otpbox = OtpFieldController();
  String? phoneNumber;
  bool startListen = false;

  @override
  void initState() {
    super.initState();
    smsConsentForOtpAutoFill = SmsConsentForOtpAutofill(
      phoneNumberListener: (number) {
        phoneNumber = number;
        print("Selected phone number: $number");
      },
      smsListener: (otpcode) {
        print("Received OTP code: $otpcode");
        setState(() {
          startListen = false;
        });
        otpbox.set(otpcode.split(""));
      },
    );
  }

  @override
  void dispose() {
    smsConsentForOtpAutoFill.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SMS Consent for OTP AutoFill'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              const Text(
                "Enter OTP Code",
                style: TextStyle(fontSize: 20),
              ),
              const SizedBox(height: 20),
              OTPTextField(
                controller: otpbox,
                length: 6,
                width: double.infinity,
                fieldWidth: 50,
                style: const TextStyle(fontSize: 17),
                textFieldAlignment: MainAxisAlignment.spaceAround,
                fieldStyle: FieldStyle.box,
                onCompleted: (pin) {
                  print("Entered OTP Code: $pin");
                },
              ),
              const SizedBox(height: 30),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  MaterialButton(
                    color: Colors.red,
                    textColor: Colors.white,
                    child: Text(startListen ? 'Stop Listening' : 'Stopped'),
                    onPressed: () async {
                      smsConsentForOtpAutoFill.dispose();
                      setState(() {
                        startListen = false;
                      });
                      print("Stop Listening.........");
                    },
                  ),
                  const SizedBox(width: 20),
                  MaterialButton(
                    color: Colors.green,
                    textColor: Colors.white,
                    child: Text(!startListen ? 'Start Listening' : 'Started'),
                    onPressed: () async {
                      smsConsentForOtpAutoFill.requestSms();
                      setState(() {
                        startListen = true;
                      });
                      print("Start Listening.........");
                    },
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

以上代码展示了一个简单的界面,用户可以选择开始或停止监听短信,并在接收到OTP后自动填充到输入框中。


更多关于Flutter短信验证码自动填充插件sms_consent_for_otp_autofill的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter短信验证码自动填充插件sms_consent_for_otp_autofill的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用sms_consent_for_otp_autofill插件来实现短信验证码自动填充的示例代码。这个插件主要用于Android平台,帮助应用自动检测和填充通过短信收到的验证码。

首先,确保你的Flutter项目中已经添加了sms_consent_for_otp_autofill依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  sms_consent_for_otp_autofill: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤来实现短信验证码的自动填充功能:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:sms_consent_for_otp_autofill/sms_consent_for_otp_autofill.dart';
  1. 请求短信验证码权限

在需要的地方(通常是用户点击“获取验证码”按钮时),请求短信读取权限。

void _requestSmsPermission() async {
  SmsConsentStatus status = await SmsConsentForOtpAutofill.requestSmsRetrievalPermission();
  if (status == SmsConsentStatus.granted) {
    print("SMS retrieval permission granted.");
    // 发送验证码请求到服务器
  } else {
    print("SMS retrieval permission denied.");
  }
}
  1. 监听短信变化

使用SmsListener来监听短信的变化,并在接收到验证码时自动填充到相应的文本框中。

class _MyAppState extends State<MyApp> {
  TextEditingController _otpController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _startSmsListener();
  }

  @override
  void dispose() {
    _otpController.dispose();
    SmsConsentForOtpAutofill.stopSmsListener();
    super.dispose();
  }

  void _startSmsListener() {
    SmsConsentForOtpAutofill.startSmsListener().listen((SmsMessage message) {
      // 假设验证码是短信内容中的最后6位数字
      RegExp exp = RegExp(r'\d{6}$');
      Iterable<Match> matches = exp.allMatches(message.body ?? '');
      if (matches.isNotEmpty) {
        String otp = matches.first.group(0)!;
        _otpController.value = TextEditingValue(
          text: otp,
          selection: TextSelection.collapsed(offset: otp.length),
        );
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SMS OTP Autofill Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextFormField(
                controller: _otpController,
                keyboardType: TextInputType.number,
                decoration: InputDecoration(
                  labelText: 'Enter OTP',
                ),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _requestSmsPermission,
                child: Text('Request OTP'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

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

在上面的代码中,我们首先请求短信读取权限,然后开始监听短信的变化。当接收到包含6位数字的短信时,我们自动将其填充到OTP文本框中。

注意

  • 在实际应用中,你可能需要根据短信格式调整正则表达式的匹配逻辑。
  • 确保你的应用具有处理短信的权限,并在AndroidManifest.xml中声明必要的权限。
  • 这个插件仅适用于Android平台,iOS平台有自己的自动填充机制,如TextContentType.oneTimeCode。

希望这个示例代码能帮助你理解如何在Flutter中使用sms_consent_for_otp_autofill插件来实现短信验证码的自动填充功能。

回到顶部