Flutter短信处理插件telephony_sms_handler的使用
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
更多关于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和其他应用商店的隐私政策和最佳实践来处理短信数据。