Flutter短信处理插件telephony_sms_handler的使用

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

Flutter短信处理插件telephony_sms_handler的使用

Telephony

感谢您查看Telephony插件。

注意

该插件目前仅支持Android平台。

功能介绍

该插件提供了以下功能:

  • 发送短信
  • 查询短信
  • 监听接收到的短信
  • 获取各种网络参数
  • 拨打电话

此插件尝试复制Android原生Telephony类的一些功能。

查看特性列表了解已实现和未实现的功能。

开始使用

文档

查看完整的文档 在这里

使用方法

要使用此插件,请将其作为依赖项添加到您的pubspec.yaml文件中。

版本

  • 0.0.9及更低版本不支持空安全。
  • 0.1.0及以上版本支持空安全。

导入包

import 'package:telephony/telephony.dart';

初始化实例

final Telephony telephony = Telephony.instance;

权限

虽然插件会在运行时检查并请求权限,但建议在调用其他函数之前手动请求权限。

请求权限

bool permissionsGranted = await telephony.requestPhoneAndSmsPermissions;

也可以单独请求短信或电话权限:

bool smsPermissionsGranted = await telephony.requestSmsPermissions;
bool phonePermissionsGranted = await telephony.requestPhonePermissions;

发送短信

直接发送短信

telephony.sendSms(
	to: "1234567890",
	message: "May the force be with you!"
	);

监听发送状态

final SmsSendStatusListener listener = (SendStatus status) {
	// 处理状态
	};
	
telephony.sendSms(
	to: "1234567890",
	message: "May the force be with you!",
	statusListener: listener
	);

发送长短信

如果短信长度超过160个字符,可以设置isMultipart标志以发送多部分短信:

telephony.sendSms(
	to: "1234567890",
	message: "May the force be with you!",
	isMultipart: true
	);

通过默认短信应用发送短信

telephony.sendSmsByDefaultApp(to: "1234567890", message: "May the force be with you!");

查询短信

需要权限

  • READ_SMS权限

添加权限

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

查询短信

List<SmsMessage> messages = await telephony.getInboxSms(
	columns: [SmsColumn.ADDRESS, SmsColumn.BODY],
	filter: SmsFilter.where(SmsColumn.ADDRESS).equals("1234567890").and(SmsColumn.BODY).like("starwars"),
	sortOrder: [OrderBy(SmsColumn.ADDRESS, sort: Sort.ASC), OrderBy(SmsColumn.BODY)]
	);

查询会话

需要权限

  • READ_SMS权限

添加权限

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

查询会话

List<SmsConversation> messages = await telephony.getConversations(
	filter: ConversationFilter.where(ConversationColumn.MSG_COUNT).equals("4").and(ConversationColumn.THREAD_ID).greaterThan("12"),
	sortOrder: [OrderBy(ConversationColumn.THREAD_ID, sort: Sort.ASC)]
	);

监听接收到的短信

需要权限

  • RECEIVE_SMS权限

注册BroadcastReceiver

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

	<application>
		...
		...

		<receiver android:name="com.shounakmulay.telephony.sms.IncomingSmsReceiver"
			android:permission="android.permission.BROADCAST_SMS" android:exported="true">
			<intent-filter>
				<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
			</intent-filter>
		</receiver>

	</application>
</manifest>

创建后台处理函数

backgrounMessageHandler(SmsMessage message) async {
	// 处理后台消息
}

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

调用监听函数

telephony.listenIncomingSms(
	onNewMessage: (SmsMessage message) {
		// 处理新消息
	},
	onBackgroundMessage: backgroundMessageHandler
);

不接收后台消息

telephony.listenIncomingSms(
	onNewMessage: (SmsMessage message) {
		// 处理新消息
	},
	listenInBackground: false
);

网络数据和指标

获取网络类型和SIM状态

// 检查设备是否支持发送短信
bool canSendSms = await telephony.isSmsCapable;

// 获取SIM状态
SimState simState = await telephony.simState;

在后台执行

使用Telephony.instance

backgrounMessageHandler(SmsMessage message) async {
	// 处理后台消息
	Telephony.instance.sendSms(to: "123456789", message: "Message from background")
}

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

class _MyAppState extends State<MyApp> {
  String _message;
  // 这将不起作用,因为实例会被后台替换
  final telephony = Telephony.instance;
  
   [@override](/user/override)
  void initState() {
    super.initState();
    // 确保每次应用回到前台时都调用实例
    final inbox = Telephony.instance.getInboxSms()
  }
}

使用Telephony.backgroundInstance

backgrounMessageHandler(SmsMessage message) async {
	// 处理后台消息
	Telephony.backgroundInstance.sendSms(to: "123456789", message: "Message from background")
}

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

class _MyAppState extends State<MyApp> {
  String _message;
  final telephony = Telephony.instance;
  
   [@override](/user/override)
  void initState() {
    super.initState();
    final inbox = telephony.getInboxSms()
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用telephony_sms_handler插件来处理短信的示例代码。这个插件允许你监听并处理设备接收到的短信。

首先,确保你已经在pubspec.yaml文件中添加了telephony_sms_handler依赖:

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

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

接下来是具体的代码实现:

1. 配置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
        ... >

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

2. 创建SmsReceiver类

android/app/src/main/kotlin/com/example/yourapp/(或java/com/example/yourapp/如果你使用Java)目录下创建一个新的Kotlin/Java类SmsReceiver.kt(或SmsReceiver.java):

Kotlin版本(SmsReceiver.kt)

package com.example.yourapp

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.SmsMessage

class SmsReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == "android.provider.Telephony.SMS_RECEIVED") {
            val bundle = intent.extras
            try {
                val pdus = bundle?.get("pdus") as Array<Any>?
                for (i in pdus.indices) {
                    val smsMessage = SmsMessage.createFromPdu(pdus[i] as ByteArray)
                    val message = smsMessage.messageBody.toString()
                    val phoneNumber = smsMessage.originatingAddress
                    // 在这里处理接收到的短信
                    println("Received SMS from $phoneNumber: $message")
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

Java版本(SmsReceiver.java)

package com.example.yourapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle bundle = intent.getExtras();
            try {
                Object[] pdus = (Object[]) bundle.get("pdus");
                for (int i = 0; i < pdus.length; i++) {
                    SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    String message = smsMessage.getMessageBody().toString();
                    String phoneNumber = smsMessage.getOriginatingAddress();
                    // 在这里处理接收到的短信
                    System.out.println("Received SMS from " + phoneNumber + ": " + message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

3. 在Flutter中使用telephony_sms_handler插件

在你的Flutter项目中,你可以使用telephony_sms_handler插件来处理一些高级逻辑(尽管实际的短信接收是由原生代码完成的)。

Dart代码示例

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

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

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

@override
void initState() {
  super.initState();
  
  // 初始化telephony_sms_handler(虽然本例中主要是原生代码处理短信)
  TelephonySmsHandler.requestSmsPermission().then((granted) {
    if (granted) {
      print("SMS permission granted");
    } else {
      print("SMS permission denied");
    }
  });

  // 注意:实际的短信监听和处理已经在原生代码中完成
  // 如果你需要在Flutter层处理更多逻辑,可以考虑通过MethodChannel与原生代码通信
}

请注意,telephony_sms_handler插件本身可能并不直接处理短信接收(这通常是通过原生Android/iOS代码完成的),而是帮助你请求相关权限或提供一些其他与短信相关的功能。上面的例子展示了如何在原生Android中处理短信接收,并通过Flutter展示了一些基本的集成步骤。

确保你遵循Google Play和其他应用商店的隐私政策和最佳实践来处理短信数据。

回到顶部