You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中追踪来电状态?无需Method Channel可行吗?

在Flutter中追踪通话状态的实现方案

核心结论

无法完全脱离原生平台能力实现通话状态追踪——因为Flutter框架本身没有提供访问系统通话状态的API。但你不需要手动编写Method Channel,借助现成的Flutter插件即可完成需求,这些插件已经封装了原生代码与跨端通信逻辑。

需求对应的状态映射

你需要的三种状态可以通过原生系统的通话状态直接映射:

  • 来电状态 → CallState.RINGING
  • 通话中 → CallState.OFFHOOK
  • 通话挂断 → CallState.IDLE(从通话中回到空闲状态即代表挂断)

具体实现步骤(使用telephony插件)

1. 添加依赖

在pubspec.yaml中引入插件:

dependencies:
  flutter:
    sdk: flutter
  telephony: ^0.2.0

2. 配置平台权限

Android(android/app/src/main/AndroidManifest.xml)

添加必要权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.CALL_PHONE" />
iOS(ios/Runner/Info.plist)

添加权限描述:

<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风以处理通话状态</string>
<key>NSContactsUsageDescription</key>
<string>需要访问联系人以关联通话信息</string>

3. Flutter代码实现监听

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

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  final Telephony telephony = Telephony.instance;
  String _currentCallStatus = "空闲";

  @override
  void initState() {
    super.initState();
    _setupCallListener();
  }

  void _setupCallListener() async {
    // 请求必要权限
    await telephony.requestPhoneAndSmsPermissions();

    // 监听通话状态变化
    telephony.callStateChanges.listen((CallState state) {
      setState(() {
        switch (state) {
          case CallState.RINGING:
            _currentCallStatus = "来电中";
            // 可选:获取来电号码
            telephony.getPhoneNumber().then((number) {
              print("来电号码:$number");
            });
            break;
          case CallState.OFFHOOK:
            _currentCallStatus = "通话中";
            break;
          case CallState.IDLE:
            _currentCallStatus = "通话挂断/空闲";
            break;
        }
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("通话状态追踪")),
        body: Center(
          child: Text("当前状态:$_currentCallStatus", style: const TextStyle(fontSize: 18)),
        ),
      ),
    );
  }
}

额外说明

  • 插件内部已封装Method Channel通信逻辑,你无需手动编写原生代码或跨端通信代码。
  • 部分Android设备可能因厂商定制系统限制,需要额外开启权限或进行适配测试。
  • iOS平台对于通话状态的监听有更严格的隐私限制,部分场景可能需要用户授权更多权限。

内容的提问来源于stack exchange,提问作者Developer Com

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:45:25