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

1 回复

更多关于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" />
回到顶部