Flutter电话呼叫状态监听插件flutter_phone_call_state的使用
Flutter电话呼叫状态监听插件flutter_phone_call_state的使用
目录
描述
此Flutter插件允许你在Android和iOS设备上跟踪和管理电话呼叫状态。它帮助你监控当前呼叫的状态(来电、去电、接听或结束),并提供实时更新。
功能
- 检测当前电话呼叫状态(来电、接听或结束)。
- 支持Android和iOS平台。
- 提供实时的呼叫状态更新。
- 简单易用的API。
原生集成
- 原生Android:
TelephonyManager
- 原生iOS:
CallKit
注意事项
- 在iOS模拟器中不工作。
- 只有在Android上才能获得电话号码!
如何安装
Flutter
dependencies:
flutter:
sdk: flutter
flutter_phone_call_state: 0.0.7
Android权限
Android: 添加权限到manifest文件
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
警告:添加
READ_CALL_LOG
权限,如果没有正当理由,你的应用将被Google Play商店移除。但如果不添加该权限,你将无法获取来电者的电话号码。
iOS权限
iOS: 添加权限到list.info
<key>UIBackgroundModes</key>
<array>
<!--add more permission-->
</array>
iOS后台监控处理
import 'package:flutter_phone_call_state/flutter_phone_call_state.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@pragma('vm:entry-point')
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
private var backgroundTaskIdentifier: UIBackgroundTaskIdentifier = .invalid
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// 初始化背景任务
initBackground()
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func initBackground(){
backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
})
}
override func applicationWillEnterForeground(_ application: UIApplication) {
super.applicationWillEnterForeground(application)
FlutterPhoneCallStatePlugin.shared.initState()
}
override func applicationDidEnterBackground(_ application: UIApplication) {
super.applicationDidEnterBackground(application)
/// 使用beginBackgroundMonitoring
FlutterPhoneCallStatePlugin.shared.beginBackgroundMonitoring()
// 或者使用自定义方法
initBackground()
}
}
警告:背景任务应该在应用程序进入后台模式之前或者在通话发起时调用。如果直接在
applicationDidEnterBackground
中调用,插件可能无法正常工作。
如何使用
获取电话呼叫状态流
final _phoneCallStatePlugin = PhoneCallState.instance;
void subscriptionPhoneCallStateChange() async {
_phoneCallStatePlugin.phoneStateChange.listen(
(event) {
switch (event.state) {
case CallState.end:
// TODO: 处理结束状态
case CallState.outgoing:
// TODO: 处理去电状态
case CallState.outgoingAccept:
// TODO: 处理去电接听状态
case CallState.incoming:
// TODO: 处理来电状态
case CallState.call:
// TODO: 处理通话状态
case CallState.none:
// TODO: 处理未知状态
case CallState.hold:
// TODO: 处理保持状态
case CallState.interruptAndHold:
// TODO: 处理中断并保持状态
}
debugPrint(event.state.description);
},
);
}
可用的呼叫状态
CallState
枚举表示电话呼叫过程中的各种状态。每个状态描述了呼叫生命周期中的特定点。以下是可能的呼叫状态:
-
CallState.end
: 呼叫已结束。这发生在呼叫由发起者或接收者断开时。 -
CallState.outgoing
: 正在拨打去电。此状态在用户发起呼叫后但在接收方接听前处于活动状态。 -
CallState.outgoingAccept
: 去电已被接收方接受。此状态表示接收方已接听呼叫,对话正在进行。 -
CallState.incoming
: 接收到来电。设备正在接收呼叫,但用户尚未接听。此状态在电话响起时处于活动状态。 -
CallState.call
: 来电已被接受。此状态在来电被用户接听且对话正在进行时触发。 -
CallState.hold
: 用户按下了保持按钮。 -
CallState.interruptAndHold
: 中断当前通话并保持以接听新的来电。 -
CallState.none
: 呼叫状态未知或未定义。当无法确定呼叫状态或状态不适用时使用此状态。
这些状态有助于跟踪电话呼叫的进展,使你能够在Flutter应用中相应地做出响应。
仅限Android的功能
-
onStateChange
: 在回调函数中返回呼叫电话状态。 -
getLastCallLog
: 返回最后呼叫或之后的呼叫日志。
示例应用
示例代码
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_phone_call_state/flutter_phone_call_state.dart';
import 'package:url_launcher/url_launcher_string.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> {
final _phoneCallStatePlugin = PhoneCallState.instance;
String status = 'none';
[@override](/user/override)
void initState() {
super.initState();
subscriptionPhoneCallStateChange();
}
void subscriptionPhoneCallStateChange() async {
_phoneCallStatePlugin.phoneStateChange.listen(
(event) {
switch (event.state) {
case CallState.end:
// TODO: 处理结束状态
case CallState.outgoing:
// TODO: 处理去电状态
case CallState.outgoingAccept:
// TODO: 处理去电接听状态
case CallState.incoming:
// TODO: 处理来电状态
case CallState.call:
// TODO: 处理通话状态
case CallState.none:
// TODO: 处理未知状态
case CallState.hold:
// TODO: 处理保持状态
case CallState.interruptAndHold:
// TODO: 处理中断并保持状态
}
debugPrint(
"Phone Number: ${event.number} <------> Phone Status:${event.state.name}");
scheduleMicrotask(() {
setState(() {
status = '${event.state.name}: ${event.number}';
});
});
},
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Column(
children: [
InkWell(
child: const Text("拨打电话:0824112873"),
onTap: () async {
/// 拨打电话
await launchUrlString("tel://0824112873");
},
),
Center(
child: Text('电话状态: $status\n'),
),
],
),
),
);
}
}
更多关于Flutter电话呼叫状态监听插件flutter_phone_call_state的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter电话呼叫状态监听插件flutter_phone_call_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_phone_call_state
是一个 Flutter 插件,用于监听设备的电话呼叫状态。它允许你在应用中检测电话的拨出、接听、挂断等状态变化。以下是如何使用 flutter_phone_call_state
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_phone_call_state
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_phone_call_state: ^1.0.0 # 请确保使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 flutter_phone_call_state
包:
import 'package:flutter_phone_call_state/flutter_phone_call_state.dart';
3. 初始化监听器
在你的应用启动时,初始化电话状态监听器。你可以选择在 initState
方法中进行初始化。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
CallState _callState = CallState.none;
@override
void initState() {
super.initState();
_initCallStateListener();
}
void _initCallStateListener() {
FlutterPhoneCallState.callStateStream.listen((CallState state) {
setState(() {
_callState = state;
});
// 根据不同的状态执行不同的操作
switch (state) {
case CallState.none:
print("No call is in progress");
break;
case CallState.incoming:
print("Incoming call is ringing");
break;
case CallState.dialing:
print("Outgoing call is being dialed");
break;
case CallState.connected:
print("Call is connected");
break;
case CallState.held:
print("Call is on hold");
break;
case CallState.disconnected:
print("Call is disconnected");
break;
case CallState.error:
print("Error occurred during call");
break;
default:
break;
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Phone Call State Example'),
),
body: Center(
child: Text('Current Call State: $_callState'),
),
),
);
}
}
4. 处理不同的呼叫状态
在上面的代码中,我们使用 FlutterPhoneCallState.callStateStream.listen
来监听电话状态的变化,并根据不同的状态执行相应的操作。
5. 请求权限
在 Android 上,监听电话状态需要 READ_PHONE_STATE
权限。你需要在 AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />