Flutter SMS用户同意管理插件sms_user_consent_manager的使用

Flutter SMS用户同意管理插件sms_user_consent_manager的使用

请求用户的手机号(支持双卡)和/或同意读取短信,而无需添加任何权限,使用Android的SMS用户同意API。 此包实际上是SMS用户同意API,但将通道类型从私有更改为公共以处理通道。

截图

使用步骤

1. 创建实例,可选地提供电话号码监听器和短信监听器

SmsUserConsent smsUserConsent = SmsUserConsent(
    // 可选地,当用户选择一个号码时做一些事情。
    // 您甚至可以稍后通过调用smsUserConsent.updatePhoneNumberListener(updatedListener)来更新此监听器
    phoneNumberListener: () {},

    // 可选地,当用户收到短信时做一些事情。
    // 您甚至可以稍后通过调用smsUserConsent.updateSmsListener(updatedListener)来更新此监听器
    smsListener: () {}
);

2a. 可选:请求用户的手机号码

smsUserConsent.requestPhoneNumber();

一旦用户选择了手机号码,可以通过以下方式访问:

smsUserConsent.selectedPhoneNumber;

2b. 可选:请求接收短信

smsUserConsent.requestSms(); 

或者您可以指定要捕获短信的发送者手机号码:

smsUserConsent.requestSms(senderPhoneNumber: sender_number);

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

smsUserConsent.receivedSms;

3. 最后,释放实例

smsUserConsent.dispose();

注意事项

根据SMS用户同意API的要求,消息将仅由插件接收如果满足以下条件:

  • 消息包含一个4到10个字符的字母数字字符串,并至少包含一个数字。
  • 消息是由不在用户联系人中的电话号码发送的。
  • 如果指定了发送者的电话号码,消息是由该号码发送的。

贡献

  • 发现了一个错误或有改进插件的想法?发送PR。
  • 发现此插件很有帮助并想感谢我?我爱 ☕。
  • 想雇佣我进行项目合作?让我们在LinkedIn上聊聊。

许可证

MIT © 2020 Harsh P


完整示例代码

import 'dart:ui';

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SmsUserConsent smsUserConsent;

  [@override](/user/override)
  void initState() {
    super.initState();
    smsUserConsent = SmsUserConsent(
        phoneNumberListener: () => setState(() {}),
        smsListener: () => setState(() {}));
  }

  [@override](/user/override)
  void dispose() {
    smsUserConsent.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('sms_user_consent Example'),
        ),
        body: Center(
          child: SizedBox(
            width: 250,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('要检索短信,请确保以下条件:'),
                SizedBox(height: 8.0),
                Text('- 消息包含一个4到10个字符的字母数字字符串,并至少包含一个数字。'),
                Text('- 消息是由不在用户联系人中的电话号码发送的。'),
                Text('- 如果指定了发送者的电话号码,消息是由该号码发送的。'),
                SizedBox(height: 16.0),
                Text('点击FABs请求手机号码和短信', style: TextStyle(fontWeight: FontWeight.bold)),
                SizedBox(height: 16.0),
                Text('已选择的手机号码: ${smsUserConsent.selectedPhoneNumber}'),
                SizedBox(height: 8.0),
                Text('接收到的短信: ${smsUserConsent.receivedSms}')
              ],
            ),
          ),
        ),
        floatingActionButton: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            FloatingActionButton(
              child: Icon(Icons.phone_android),
              onPressed: () => smsUserConsent.requestPhoneNumber(),
            ),
            SizedBox(height: 16.0),
            Builder(builder: (context) => FloatingActionButton(
              child: Icon(Icons.sms),
              onPressed: () {
                // 调用您的服务器获取短信,然后
                // requestOtp();

                smsUserConsent.requestSms();

                print('正在监听短信...');
              }
            ))
          ],
        )
      ),
    );
  }
}

更多关于Flutter SMS用户同意管理插件sms_user_consent_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter中,sms_user_consent_manager 是一个用于管理用户同意读取短信的插件。它可以帮助你在应用中请求用户同意读取短信内容,这在使用短信验证码等场景中非常有用。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 sms_user_consent_manager 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sms_user_consent_manager: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 请求用户同意

在你的 Dart 代码中,你可以使用 SmsUserConsentManager 来请求用户同意读取短信。

import 'package:sms_user_consent_manager/sms_user_consent_manager.dart';

void requestSmsConsent() async {
  try {
    bool hasConsent = await SmsUserConsentManager.requestSmsConsent();
    if (hasConsent) {
      print("用户已同意读取短信");
      // 在这里处理短信读取逻辑
    } else {
      print("用户拒绝了读取短信的请求");
    }
  } catch (e) {
    print("请求短信读取权限时出错: $e");
  }
}

3. 处理短信内容

一旦用户同意读取短信,你可以使用 SmsUserConsentManager 来监听并读取短信内容。

void listenForSms() async {
  SmsUserConsentManager.onSmsReceived.listen((SmsMessage message) {
    print("收到短信: ${message.body}");
    // 在这里处理短信内容
  });
}

4. 权限处理

确保在 AndroidManifest.xml 文件中添加必要的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>

5. 处理用户拒绝

如果用户拒绝了读取短信的请求,你可以提示用户手动输入验证码,或者引导用户到设置中开启权限。

void handleUserRejection() {
  // 提示用户手动输入验证码
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text("权限被拒绝"),
        content: Text("请手动输入验证码或前往设置开启权限。"),
        actions: <Widget>[
          TextButton(
            child: Text("确定"),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );
}

6. 完整示例

以下是一个完整的示例,展示了如何请求用户同意并处理短信内容:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SmsConsentScreen(),
    );
  }
}

class SmsConsentScreen extends StatefulWidget {
  [@override](/user/override)
  _SmsConsentScreenState createState() => _SmsConsentScreenState();
}

class _SmsConsentScreenState extends State<SmsConsentScreen> {
  String smsContent = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    requestSmsConsent();
    listenForSms();
  }

  void requestSmsConsent() async {
    try {
      bool hasConsent = await SmsUserConsentManager.requestSmsConsent();
      if (hasConsent) {
        print("用户已同意读取短信");
      } else {
        print("用户拒绝了读取短信的请求");
        handleUserRejection();
      }
    } catch (e) {
      print("请求短信读取权限时出错: $e");
    }
  }

  void listenForSms() async {
    SmsUserConsentManager.onSmsReceived.listen((SmsMessage message) {
      setState(() {
        smsContent = message.body;
      });
    });
  }

  void handleUserRejection() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text("权限被拒绝"),
          content: Text("请手动输入验证码或前往设置开启权限。"),
          actions: <Widget>[
            TextButton(
              child: Text("确定"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SMS 用户同意管理'),
      ),
      body: Center(
        child: Text('收到的短信内容: $smsContent'),
      ),
    );
  }
}
回到顶部