10 способов напрямую позвонить на номер телефона во Flutter: подробное руководство

Flutter, набор инструментов пользовательского интерфейса с открытым исходным кодом от Google, приобрел огромную популярность среди разработчиков для создания кроссплатформенных мобильных приложений. Одним из распространенных требований к мобильным приложениям является возможность прямого вызова телефонного номера. В этой статье мы рассмотрим различные методы достижения этой функциональности с помощью Flutter, а также примеры кода и разговорные объяснения.

Метод 1: использование пакета url_launcher
Пакет url_launcher — популярный выбор для запуска URL-адресов во Flutter. Чтобы позвонить по номеру телефона напрямую, мы можем использовать метод пакета launchс соответствующей схемой URL:

import 'package:url_launcher/url_launcher.dart';
void callPhoneNumber(String phoneNumber) async {
  final url = 'tel:$phoneNumber';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

Метод 2: использование плагина flutter_phone_direct_call
Плагин flutter_phone_direct_call предоставляет удобный способ прямого вызова телефонного номера без какого-либо дополнительного взаимодействия с пользователем. Чтобы использовать этот плагин, выполните следующие действия:

Шаг 1. Добавьте зависимость плагина в файл pubspec.yaml:

dependencies:
  flutter_phone_direct_call: ^3.0.0

Шаг 2. Импортируйте библиотеку и вызовите класс FlutterPhoneDirectCaller:

import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
void callPhoneNumber(String phoneNumber) async {
  bool res = await FlutterPhoneDirectCaller.callNumber(phoneNumber);
  if (!res) {
    throw 'Could not call $phoneNumber';
  }
}

Метод 3: использование пакетов url_launcher и Permission_handler
В некоторых случаях вам может потребоваться запросить необходимые разрешения перед совершением телефонного звонка. Для этого пакет Permission_handler можно объединить с url_launcher:

Шаг 1. Добавьте зависимости плагина в файл pubspec.yaml:

dependencies:
  url_launcher: ^6.0.0
  permission_handler: ^12.0.0

Шаг 2. Импортируйте библиотеки и запросите разрешение на телефонный звонок:

import 'package:url_launcher/url_launcher.dart';
import 'package:permission_handler/permission_handler.dart';
void callPhoneNumber(String phoneNumber) async {
  final status = await Permission.phone.request();
  if (status.isGranted) {
    final url = 'tel:$phoneNumber';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  } else {
    throw 'Phone call permission not granted.';
  }
}

Метод 4. Использование пакетов android_intent и Intent (только для Android).
Если вы ориентируетесь конкретно на устройства Android, вы можете использовать пакеты android_intent и Intent для прямого звонка по номеру телефона:

Шаг 1. Добавьте зависимости плагина в файл pubspec.yaml:

dependencies:
  android_intent: ^2.0.0
  intent: ^1.2.0

Шаг 2. Импортируйте библиотеки и вызовите класс AndroidIntent:

import 'package:android_intent/android_intent.dart';
import 'package:intent/intent.dart' as android_intent;
import 'package:intent/action.dart' as android_action;
void callPhoneNumber(String phoneNumber) {
  final intent = AndroidIntent(
    action: android_action.Action.ACTION_CALL,
    data: 'tel:$phoneNumber',
  );
  intent.launch();
}

Метод 5. Использование пакета телефонии (только для Android)
Для устройств Android пакет телефонии позволяет совершать прямые телефонные звонки:

Шаг 1. Добавьте зависимость плагина в файл pubspec.yaml:

dependencies:
  telephony: ^5.0.0

Шаг 2. Импортируйте библиотеку и вызовите класс telephony:

import 'package:telephony/telephony.dart';
void callPhoneNumber(String phoneNumber) {
  final telephony = Telephony.instance;
  telephony.openDialer(phoneNumber);
}

Метод 6. Использование пакетов url_launcher и Permission_handler (только для iOS)
Для устройств iOS можно использовать тот же подход, что и в методе 3, но с особой обработкой для платформы iOS:

Шаг 1. Добавьте зависимости плагина в файл pubspec.yaml:

dependencies:
  url_launcher: ^6.0.0
  permission_handler: ^12.0.0

Шаг 2. Импортируйте библиотеки и запросите разрешение на телефонный звонок:

import 'package:url_launcher/url_launcher.dart';
import 'package:permission_handler/permission_handler.dart';
void callPhoneNumber(String phoneNumber) async {
  final status = await Permission.phone.request();
  if (status.isGranted) {
    final url = 'tel:$phoneNumber';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  } else {
    throw 'Phone call permission not granted.';
  }
}

Метод 7. Использование пакета call_number (только для iOS)
Пакет call_number предоставляет простой способ прямого вызова телефонного номера на устройствах iOS:

Шаг 1. Добавьте зависимость плагина в файл pubspec.yaml:

dependencies:
  call_number: ^2.0.0

Шаг 2. Импортируйте библиотеку и вызовите метод call:

import 'package:call_number/call_number.dart';
void callPhoneNumber(String phoneNumber) async {
  await CallNumber().callNumber(phoneNumber);
}

Метод 8: использование пакетов url_launcher и Permission_handler (Интернет)
Для веб-приложений, созданных с помощью Flutter, вы можете использовать пакет url_launcher для инициации телефонных звонков:

Шаг 1. Добавьте зависимость плагина в файл pubspec.yaml:

dependencies:
  url_launcher: ^6.0.0

Шаг 2. Импортируйте библиотеку и вызовите метод launch:

import 'package:url_launcher/url_launcher.dart';
void callPhoneNumber(String phoneNumber) async {
  final url = 'tel:$phoneNumber';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

Метод 9: использование пакета firebase_dynamic_links
Если вы хотите отслеживать телефонные звонки или выполнять дополнительные действия после звонка, вы можете использовать динамические ссылки Firebase:

Шаг 1. Добавьте зависимость плагина в файл pubspec.yaml:

dependencies:
  firebase_dynamic_links: ^2.0.0

Шаг 2. Импортируйте библиотеку и создайте динамическую ссылку:

import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
void callPhoneNumber(String phoneNumber) async {
  final DynamicLinkParameters parameters = DynamicLinkParameters(
    uriPrefix: 'https://your-domain.page.link',
    link: Uri.parse('https://your-domain.com/call?phoneNumber=$phoneNumber'),
    androidParameters: AndroidParameters(
      packageName: 'com.your.package',
    ),
    iosParameters: IosParameters(
      bundleId: 'com.your.bundle',
    ),
  );
  final ShortDynamicLink dynamicUrl = await parameters.buildShortLink();
  final Uri dynamicUri = dynamicUrl.shortUrl;
  // Use the dynamicUri to initiate the phone call.
}

Метод 10. Использование кода, специфичного для платформы, с MethodChannels.
Если ни один из вышеперечисленных методов не соответствует вашим потребностям, вы можете создать реализацию для конкретной платформы, используя MethodChannels:

Шаг 1. Настройте MethodChannel в коде Flutter:

import 'package:flutter/services.dart';
final platform = MethodChannel('com.your.channel');
void callPhoneNumber(String phoneNumber) async {
  try {
    await platform.invokeMethod('callPhoneNumber', phoneNumber);
  } on PlatformException catch (e) {
    throw 'Failed to call phone number: ${e.message}';
  }
}

Шаг 2. Реализуйте метод на каждой платформе (Android и iOS) с помощью собственного кода.

В этой статье мы рассмотрели десять различных способов прямого вызова телефонного номера во Flutter. Каждый метод демонстрировал разные подходы: от использования плагинов Flutter, таких как url_launcher и flutter_phone_direct_caller, до кода, специфичного для платформы, с MethodChannels. В зависимости от ваших требований и целевых платформ вы можете выбрать наиболее подходящий метод реализации функций телефонных звонков в ваших приложениях Flutter.