Flutter短信接收插件sms_receiver的使用

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

Flutter短信接收插件sms_receiver的使用

sms_receiver 是一个用于读取传入且预期的SMS消息的Flutter插件。需要注意的是,该插件主要为Android平台开发,可以在不请求SMS权限的情况下读取消息。

注意事项

使用步骤

生成可接受的消息格式

不要在运行时使用 AppSignatureHelper 生成哈希消息。将哈希作为常量存储在你的应用程序中,无论是服务器端还是客户端。

添加依赖

首先,在你的 pubspec.yaml 文件中添加 sms_receiver 依赖:

dependencies:
  sms_receiver: ^0.4.2

创建并使用 SmsReceiver 实例

以下是一个完整的示例Demo:

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

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? _textContent = 'Waiting for messages...';
  SmsReceiver? _smsReceiver;

  @override
  void initState() {
    super.initState();
    // 初始化SmsReceiver实例,并设置消息接收和超时处理函数
    _smsReceiver = SmsReceiver(onSmsReceived, onTimeout: onTimeout);
    _startListening(); // 开始监听
  }

  // 当接收到消息时调用
  void onSmsReceived(String? message) {
    setState(() {
      _textContent = message;
    });
  }

  // 超时时调用
  void onTimeout() {
    setState(() {
      _textContent = 'Timeout!!!';
    });
  }

  // 开始监听短信
  void _startListening() async {
    if (_smsReceiver == null) return;
    await _smsReceiver?.startListening();
    setState(() {
      _textContent = 'Waiting for messages...';
    });
  }

  // 停止监听短信
  void _stopListening() async {
    if (_smsReceiver == null) return;
    await _smsReceiver?.stopListening();
    setState(() {
      _textContent = 'Listener Stopped';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SMS Listener App'),
        ),
        body: Column(
          children: <Widget>[
            Container(
              padding: const EdgeInsets.symmetric(vertical: 16.0),
              alignment: Alignment.center,
              child: Text(_textContent ?? 'empty'),
            ),
            ElevatedButton(
              child: const Text('Listen Again'),
              onPressed: _startListening,
            ),
            ElevatedButton(
              child: const Text('Stop Listener'),
              onPressed: _stopListening,
            ),
          ],
        ),
      ),
    );
  }
}

关键点

  • 接收器超时:接收器的超时时间为5分钟,目前不可配置。
  • 重新启动监听:一旦接收到短信或接收器超时,请再次调用 startListening() 方法以继续监听新的短信。

通过上述步骤和代码示例,你应该能够在你的Flutter应用中成功集成并使用 sms_receiver 插件来监听短信。


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

1 回复

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


当然,以下是如何在Flutter项目中使用sms_receiver插件来接收短信的一个基本示例。sms_receiver插件允许你的Flutter应用监听并接收短信。需要注意的是,接收短信通常需要设备的特定权限,并且可能受限于操作系统的安全和隐私策略。

步骤 1: 添加依赖

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

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

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

步骤 2: 配置Android权限

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

    <application
        ...>
        <!-- Add the receiver for SMS -->
        <receiver android:name=".SmsReceiver" android:exported="true" android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

注意:SmsReceiver是我们在下一步中将要创建的类。

步骤 3: 创建SmsReceiver类

android/app/src/main/kotlin/com/example/yourapp/(或者java/com/example/yourapp/如果你使用的是Java)目录下创建一个名为SmsReceiver.kt(或SmsReceiver.java)的文件,并添加以下代码:

SmsReceiver.kt:

package com.example.yourapp

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.SmsMessage
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class SmsReceiver : BroadcastReceiver() {
    companion object {
        private const val CHANNEL = "com.example.yourapp/sms"
    }

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == "android.provider.Telephony.SMS_RECEIVED") {
            val extras = intent.extras
            val pdus = extras?.get("pdus") as? Array<ByteArray>

            for (i in pdus?.indices ?: emptyList()) {
                val sms = SmsMessage.createFromPdu(pdus[i])
                val messageBody = sms.messageBody.toString()
                val phoneNumber = sms.originatingAddress

                // 获取FlutterEngine实例(这里需要你的应用逻辑来确保FlutterEngine是可用的)
                // 假设你已经有一个全局的FlutterEngine实例
                val flutterEngine: FlutterEngine? = ... // TODO: 获取你的FlutterEngine实例
                flutterEngine?.dartExecutor?.executeDartEntrypoint(
                    DartExecutor.DartEntrypoint.createDefault()
                )
                val channel = MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CHANNEL)
                channel.invokeMethod("smsReceived", mapOf(
                    "phoneNumber" to phoneNumber,
                    "message" to messageBody
                ))
            }
        }
    }
}

注意:在实际应用中,你需要确保FlutterEngine实例是可用的。这通常涉及到在FlutterActivity或FlutterFragment中管理FlutterEngine的生命周期。由于这超出了简单示例的范围,你可能需要根据你的应用架构来调整这部分代码。

步骤 4: 在Flutter中监听短信

在你的Flutter应用中,你可以使用MethodChannel来监听从原生Android代码发送的短信数据。在lib/目录下创建一个Dart文件(例如sms_listener.dart),并添加以下代码:

import 'package:flutter/services.dart';

class SmsListener {
  static const MethodChannel _channel = MethodChannel('com.example.yourapp/sms');

  static Function(String phoneNumber, String message)? _onSmsReceived;

  static void listen(Function(String phoneNumber, String message) onSmsReceived) {
    _onSmsReceived = onSmsReceived;
    _channel.setMethodCallHandler((MethodCall call) async {
      if (call.method == 'smsReceived') {
        final Map<String, dynamic> arguments = call.arguments as Map<String, dynamic>;
        final String phoneNumber = arguments['phoneNumber'] as String;
        final String message = arguments['message'] as String;
        _onSmsReceived!(phoneNumber, message);
      }
    });
  }
}

然后,在你的主应用代码中调用这个监听器:

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

void main() {
  SmsListener.listen((phoneNumber, message) {
    print("Received SMS from $phoneNumber: $message");
  });

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SMS Receiver Demo'),
        ),
        body: Center(
          child: Text('Waiting for SMS...'),
        ),
      ),
    );
  }
}

总结

以上代码展示了如何在Flutter应用中使用sms_receiver插件(尽管实际上并没有一个直接名为sms_receiver的官方Flutter插件,上述代码示例基于自定义实现)来接收短信。由于接收短信涉及到原生代码和权限管理,因此这个过程相对复杂。在实际应用中,你可能需要处理更多的边缘情况和错误处理。

回到顶部