如何从 SMS 获取 OTP - 自动填充

问题描述

我想自动捕捉或读取短信的一次性密码。我做了一些像这样的代码测试:

import 'package:Flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',theme: ThemeData(
        primarySwatch: Colors.blue,),home: MyHomePage(title: 'Demo Auto OTP'),);
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key,this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController _textController = TextEditingController();
  String _error;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Multi-Factor-Authentication"),body: Form(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,mainAxisSize: MainAxisSize.min,children: [
              TextField(
                controller: _textController,autofillHints: [ AutofillHints.oneTimeCode ],keyboardType: TextInputType.visiblePassword,maxLength: 6,maxLengthEnforced: true,style: TextStyle(fontSize: 32),RaisedButton(
                child: Text("Verify"),onpressed: () => Navigator.of(context).pop(_textController.value.text),],)
    );
  }
}

这是测试短信:12345 is your code to log in.

oneTimeCode 的 Flutter 文档: https://api.flutter.dev/flutter/services/AutofillHints/oneTimeCode-constant.html

颤动自动填充:https://github.com/flutter/flutter/blob/7891006299/packages/flutter/lib/src/services/autofill.dart#L362

IOS:https://developer.apple.com/documentation/uikit/uitextcontenttype

安卓: https://developer.android.com/reference/androidx/autofill/HintConstants#AUTOFILL_HINT_SMS_OTP

解决方法

您可以使用这个包:https://pub.dev/packages/sms_autofill

但请考虑以下限制:

Android SMS 约束 接收代码需要遵循 此处描述的一些规则: https://developers.google.com/identity/sms-retriever/verify

不超过 140 个字节 以前缀 开始包含一个 客户端发送回您的服务器以完成的一次性代码 验证流程以 11 个字符的哈希字符串结尾 识别您的应用 SMS 的一个示例是:

ExampleApp:您的代码是 123456 FA+9qCX9VSu

,

我已使用此 package 接收短信 Check it

它的作用是通过它的监听器监听 SMS,当 SMS 到达时它打印 SMS。

这是Code,我之前为此写过(我不确定软件包是否进行了一些更改或更新,因为我已经有一段时间没有使用它了,但是那个时候它工作得很好。),

SmsReceiver receiver = new SmsReceiver();
await receiver.onSmsReceived.listen((SmsMessage msg) => checkSMS(msg));

打印SMS主体的方法,

  checkSMS(SmsMessage msg) async {
    print(msg.body);
  }

现在您可以自动填充 SMS 并使用 OTP 中的一些 regex 提取 msg.body,并将其设置为 TextFieldController 文本以进行自动填充。

注意:它会获取每条短信,因此要获取唯一一条您需要的短信,您必须检查关键字或在您身边设置一些正则表达式以仅显示 OTP 消息或您的公司名称。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...