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.