Flutter拨打电话功能插件flutter_call_phone_intent的使用

Flutter拨打电话功能插件flutter_call_phone_intent的使用

Description

flutter_call_phone_intent 是一个用于在 Flutter 应用中实现拨打电话功能的插件。通过此插件,开发者可以轻松调用手机的拨号界面、检查权限、接听电话或挂断电话。


Software Architecture

该插件的架构主要围绕以下核心功能展开:

  1. 初始化插件。
  2. 请求拨打电话权限。
  3. 拨打指定号码。
  4. 接听或挂断当前通话。
  5. 监听通话状态的变化。

Installation

pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter_call_phone_intent: ^1.0.0

运行命令以安装依赖:

flutter pub get

同时,确保在 Android 的 AndroidManifest.xml 中添加拨打电话权限:

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

Instructions

初始化插件

在应用中初始化插件并请求权限。

final _flutterPhoneCallAutoPlugin = FlutterCallPhoneIntent();

// 初始化插件
await _flutterPhoneCallAutoPlugin.init();

// 请求拨打电话权限
await _flutterPhoneCallAutoPlugin.requestPermissions();

调用拨打电话功能

通过指定电话号码拨打电话。

// 检查权限是否已授予
if (await _flutterPhoneCallAutoPlugin.checkPermissions() ?? false) {
  // 拨打电话
  var result = await _flutterPhoneCallAutoPlugin.callPhone(phoneNumber: "123456789");
  print('拨打结果: $result');
} else {
  // 如果权限未授予,则请求权限
  await _flutterPhoneCallAutoPlugin.requestPermissions();
}

接听和挂断电话

接听和挂断当前通话。

// 挂断电话
await _flutterPhoneCallAutoPlugin.endCall();

// 接听电话
await _flutterPhoneCallAutoPlugin.answerCall();

监听通话状态变化

监听通话状态(如 RINGING、OFFHOOK、IDLE)。

_flutterPhoneCallAutoPlugin.onCallStateChanged().listen((callState) {
  print('通话状态变化: $callState');
});

完整示例代码

以下是完整的示例代码,展示如何集成和使用 flutter_call_phone_intent 插件。

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_call_phone_intent/flutter_call_phone_intent.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> with WidgetsBindingObserver {
  final _flutterPhoneCallAutoPlugin = FlutterCallPhoneIntent();

  String statCallState = ''; // 保存通话状态

  [@override](/user/override)
  void initState() {
    super.initState();
    initData();
    WidgetsBinding.instance.addObserver(this);
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    print('App生命周期状态变化: $state');
    // 根据状态执行相应逻辑
    // if (state == AppLifecycleState.paused) {
    //   await _flutterPhoneCallAutoPlugin.endCall();
    // }
  }

  // 初始化插件和监听通话状态
  initData() async {
    await _flutterPhoneCallAutoPlugin.init();
    await _flutterPhoneCallAutoPlugin.requestPermissions();
    _flutterPhoneCallAutoPlugin.onCallStateChanged().listen((event) {
      setState(() {
        statCallState += event.toString();
      });
      log('-----------通话状态变化:$event------------');
      // 呼叫中: OFFHOOK
      // 挂断: IDLE
      // 来电: RINGING
    });
  }

  // 拨打电话
  onCallPhone() async {
    if (await _flutterPhoneCallAutoPlugin.checkPermissions() ?? false) {
      var number = await _flutterPhoneCallAutoPlugin.callPhone(phoneNumber: "11111122233");
      log('-----------拨打电话:$number------------');
    } else {
      await _flutterPhoneCallAutoPlugin.requestPermissions();
    }
  }

  // 挂断电话
  onEndPhone() async {
    await _flutterPhoneCallAutoPlugin.endCall();
  }

  // 接听电话
  onAnswerCall() async {
    await _flutterPhoneCallAutoPlugin.answerCall();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('拨打电话插件示例'),
        ),
        body: Column(
          children: [
            // 拨打电话按钮
            InkWell(
              onTap: onCallPhone,
              child: Container(
                padding: const EdgeInsets.all(20),
                child: Text('拨打电话'),
              ),
            ),
            SizedBox(height: 20),
            // 挂断电话按钮
            InkWell(
              onTap: onEndPhone,
              child: Container(
                padding: const EdgeInsets.all(20),
                child: Text('挂断电话'),
              ),
            ),
            SizedBox(height: 20),
            // 接听电话按钮
            InkWell(
              onTap: onAnswerCall,
              child: Container(
                padding: const EdgeInsets.all(20),
                child: Text('接听电话'),
              ),
            ),
            SizedBox(height: 20),
            // 显示通话状态
            Center(
              child: Text(
                statCallState,
                style: TextStyle(color: Colors.red),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter拨打电话功能插件flutter_call_phone_intent的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter拨打电话功能插件flutter_call_phone_intent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想实现拨打电话的功能,可以使用 flutter_call_phone_intent 插件。这个插件可以帮助你直接调用设备的拨号界面,并自动填充电话号码。以下是使用 flutter_call_phone_intent 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_call_phone_intent 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_call_phone_intent: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_call_phone_intent/flutter_call_phone_intent.dart';

3. 使用插件拨打电话

你可以使用 FlutterCallPhoneIntent.callPhone 方法来拨打电话。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Call Phone Intent Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String phoneNumber = '1234567890'; // 你要拨打的电话号码
              await FlutterCallPhoneIntent.callPhone(phoneNumber);
            },
            child: Text('Call Phone'),
          ),
        ),
      ),
    );
  }
}

4. 权限配置(仅限Android)

在Android平台上,拨打电话需要 CALL_PHONE 权限。你需要在 AndroidManifest.xml 文件中添加以下权限声明:

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

确保你的应用有权限拨打电话。

5. 处理权限请求(仅限Android)

如果你在Android 6.0及以上版本中运行应用,你还需要动态请求 CALL_PHONE 权限。你可以使用 permission_handler 插件来实现这一点。

首先,添加 permission_handler 依赖:

dependencies:
  permission_handler: ^10.0.0

然后,在拨打电话之前请求权限:

import 'package:permission_handler/permission_handler.dart';

...

onPressed: () async {
  var status = await Permission.phone.request();
  if (status.isGranted) {
    String phoneNumber = '1234567890'; // 你要拨打的电话号码
    await FlutterCallPhoneIntent.callPhone(phoneNumber);
  } else {
    // 处理权限被拒绝的情况
  }
},
回到顶部