Flutter短信同意插件android_sms_consent的使用

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

Flutter短信同意插件 android_sms_consent 的使用

android_sms_consent 是一个用于在 Android 设备上执行一键短信验证的 Flutter 插件。该插件利用 SMS User Consent API 来简化短信验证码的获取过程。

使用条件

为了触发该 API,以下条件必须满足:

  1. 短信中包含一个 4-10 个字符的字母数字字符串,并且至少包含一个数字。
  2. 短信是由不在用户联系人列表中的电话号码发送的。
  3. 如果指定了发送者的电话号码,则短信必须由该号码发送。

示例代码

下面是一个完整的示例应用,演示了如何在 Flutter 中使用 android_sms_consent 插件来监听和处理短信验证码。

主要步骤

  1. 初始化 AndroidSmsConsent 对象。
  2. 设置回调函数以处理不同的事件(如允许、拒绝或未匹配模式)。
  3. 启动监听器。
  4. 在适当的时候停止监听器。
// Copyright (c) 2021 The Khalti Authors. All rights reserved.

import 'package:android_sms_consent/android_sms_consent.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late final AndroidSmsConsent _androidSmsConsent;
  ScaffoldMessengerState? _scaffoldMessenger;

  String _sms = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    
    // 初始化 AndroidSmsConsent 实例
    _androidSmsConsent = AndroidSmsConsent(
      pattern: r'\d{4,}', // 匹配至少4位数的数字串
      onAllowed: (sms) { // 当用户允许读取短信时调用
        _sms = sms;
        setState(() {});
      },
      onDenied: () { // 当用户拒绝读取短信时调用
        _scaffoldMessenger?.showSnackBar(
          const SnackBar(content: Text('User denied!')),
        );
      },
      onPatternUnmatched: () { // 当没有找到符合模式的短信时调用
        _scaffoldMessenger?.showSnackBar(
          const SnackBar(
            content: Text('OTP not found! Please try entering OTP manually.'),
          ),
        );
      },
    )
      ..start('TestOne') // 开始监听来自 'TestOne' 的短信
      ..start('TestTwo'); // 可选:开始监听来自 'TestTwo' 的短信
  }

  [@override](/user/override)
  void dispose() {
    _androidSmsConsent.stop(); // 停止监听
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Android SMS Consent'),
        ),
        body: Builder(
          builder: (context) {
            _scaffoldMessenger ??= ScaffoldMessenger.of(context);

            return Center(
              child: Text(
                'SMS: $_sms', // 显示接收到的短信内容
                style: Theme.of(context).textTheme.bodySmall,
              ),
            );
          },
        ),
      ),
    );
  }
}

更多关于Flutter短信同意插件android_sms_consent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter短信同意插件android_sms_consent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成android_sms_consent插件以处理短信验证同意的功能,可以遵循以下步骤。这个插件主要用于在Android设备上请求和验证用户的短信权限,常见于一次性密码(OTP)验证的场景。

首先,确保你的Flutter环境已经正确设置,并且你的项目已经初始化。

1. 添加依赖

在你的pubspec.yaml文件中添加android_sms_consent依赖:

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

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

2. 配置AndroidManifest.xml

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"/>

    <!-- 其他配置 -->

</manifest>

注意:从Android 10(API级别29)开始,直接读取短信内容需要动态请求权限,而android_sms_consent插件会帮助你处理这部分逻辑。

3. 使用插件

在你的Flutter代码中,你可以按照以下方式使用android_sms_consent插件:

import 'package:flutter/material.dart';
import 'package:android_sms_consent/android_sms_consent.dart';

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

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

class _MyAppState extends State<MyApp> {
  String? otpCode;

  void _requestSmsPermission() async {
    try {
      // 自定义你的应用程序哈希值和应用名称
      final result = await SmsRetrieverHelper.startSmsRetriever(
        appName: "Your App Name",
        appHash: "your-app-hash",  // 你需要通过`keytool`命令生成应用的SHA-256哈希值
        phoneNumber: "+1234567890", // 用户的手机号码
        timeoutDuration: Duration(minutes: 5),
        callback: (SmsMessage message) {
          setState(() {
            otpCode = message.body;
          });
          print("Received OTP: $otpCode");
        },
      );

      if (result == SmsRetrieverHelper.SUCCESS) {
        print("SMS Retriever API started successfully.");
      } else {
        print("Failed to start SMS Retriever API.");
      }
    } catch (e) {
      print("Error: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SMS Consent Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('OTP Code: ${otpCode ?? "N/A"}'),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _requestSmsPermission,
                child: Text('Request SMS Permission'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 应用哈希值:你需要使用keytool命令生成你的应用的SHA-256哈希值,并将其替换到appHash参数中。这个哈希值是基于你的应用的签名密钥生成的。

  2. 电话号码:在实际应用中,电话号码通常不会硬编码在代码中,而是从用户输入或其他安全的方式获取。

  3. 权限处理:从Android 10开始,读取短信内容需要动态请求READ_SMS权限。android_sms_consent插件在内部处理了这个逻辑,但你可能需要在UI上提示用户授予权限。

  4. 测试:在测试时,确保你使用的是真实设备或模拟器,并且模拟发送短信以验证功能。

通过上述步骤,你应该能够在Flutter应用中成功集成并使用android_sms_consent插件来处理短信验证同意的功能。

回到顶部