我该如何在Flutter中拨打电话?

51
我正在制作一个Flutter应用程序,希望在点击按钮后拨打电话号码。有什么最好的方法吗?
谢谢!

查看最新答案:https://dev59.com/P1IG5IYBdhLWcg3wnS49#67722228 - Pratik Butani
8个回答

87

这个方法将会打开拨号器:

_launchCaller() async {
    const url = "tel:1234567";   
    if (await canLaunch(url)) {
       await launch(url);
    } else {
      throw 'Could not launch $url';
    }   
}

编辑:

如果有人遇到错误:

在pubspec.yaml中添加url_launcher:并运行flutter get

此外,import 'package:url_launcher/url_launcher.dart';


2
这应该是正确且被接受的答案。它完美地工作了。相同的参考资料可以在以下链接中找到:https://pub.dartlang.org/packages/url_launcher - Pawan
不要忘记添加查询/权限。 仔细查看“配置”部分。 https://pub.dev/documentation/url_launcher/latest/ - Galti

37
通常,要与底层平台交互,您必须编写特定于平台的代码并使用 平台通道 进行通信。但是,Flutter提供了一些与平台的集成点。例如,要拨打电话,您可以使用 UrlLauncher.launch API,并使用tel协议来拨打电话。

类似UrlLauncher.launch("tel://<phone_number>");应该在所有平台上都可以正常工作。

请注意,这在模拟器中不起作用。因此,请确保使用实际设备测试此功能。


1
还有更低级别的手机活动吗?我正在考虑创建一个完整的替代拨号应用程序,想知道是否可以在Flutter中完成。 - retorquere
4
链接到 UrlLauncher 不再可用,该功能似乎已被移动到一个新的包中:https://pub.dartlang.org/packages/url_launcher。 - Renato
4
请注意,这在模拟器中不起作用。非常感谢! - DmitryKanunnikoff
不要忘记添加查询/权限。 查看“配置”部分。 https://pub.dev/documentation/url_launcher/latest/ - Galti

9
您可以使用 url_launcher 小部件 (https://pub.dev/packages/url_launcher)。
  1. Add this to your package's pubspec.yaml file: dependencies: url_launcher: ^5.7.10

  2. Install it: $ flutter pub get

  3. Import it import 'package:url_launcher/url_launcher.dart';

  4. Inside your class, define this method so you can call from any action in your code:

     Future<void> _makePhoneCall(String url) async {
     if (await canLaunch(url)) {
       await launch(url);
     } else {
       throw 'Could not launch $url';
     }
    

    }

  5. inside the build widget:

     IconButton(icon: new Icon(Icons.phone),
        onPressed: () 
        {
           setState(() {
              _makePhoneCall('tel:0597924917');
           });
        },
      ),
    

注意 1:你应该使用前缀“tel”编写电话号码:“tel:0123456789”

注意 2:有时直到您关闭移动应用程序并重新打开它,Flutter才能成功注入新小部件的代码,此时原来的代码可能无法正常工作。


7
使用 url_launcher
import 'package:url_launcher/url_launcher.dart';
    
openDialPad(String phoneNumber) async {
    Uri url = Uri(scheme: "tel", path: phoneNumber);
    if (await canLaunchUrl(url)) {
      await launchUrl(url);
    } else {
       print("Can't open dial pad.");
    }
}

注意:根据文档的要求,不要忘记更新info.plistAndroidManifest.xml

4

请按照以下步骤操作:

  1. add the url_launcher: Latest version dependency in your pubspec.yaml

  2. Go to \android\app\src\main\AndroidManifest.xml.

  3. add the queries lines before the <application, like this :

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.example.flutter">
         <queries>
             <intent>
                 <action android:name="android.intent.action.DIAL" />
                 <data android:scheme="tel" />
             </intent>
         </queries>
        <application ...
    

如需更多查询,请访问此处

4.添加拨号功能,设置url:final url ="tel:$phoneNumber",如下:

  Future<void> dialNumber(
      {required String phoneNumber, required BuildContext context}) async {
    final url = "tel:$phoneNumber";
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      ShowSnackBar.showSnackBar(context, "Unable to call $phoneNumber");
    }

    return;
  }
  1. 完成

3

这太容易了,点击链接

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

void main() {
  runApp(Scaffold(
    body: Center(
      child: RaisedButton(
        onPressed: _callNumber,
        child: Text('Call Number'),
      ),
    ),
  ));
}

_callNumber() async{
  const number = '08592119XXXX'; //set the number here
  bool res = await FlutterPhoneDirectCaller.callNumber(number);
}

3

以下是我在2023年1月的实践结果:

NB:与上面其他答案的主要区别在于我的#4

ALSO:现在您可以在模拟器中测试此功能

步骤:

1.将url_launcher:latest添加到pubspec.yaml

2.配置:

对于IOS:tel方案传递给canLaunchUrl作为LSApplicationQueriesSchemes条目添加到您的Info.plist文件中。

像这样:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>tel</string>
</array>

对于安卓:在你的 AndroidManifest.xml 文件中添加 tel 方案,将其作为 queries 条目传递给 canLaunchUrl。[即 \android\app\src\main\AndroidManifest.xml 文件中]

就像这样:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.flutApp">
     <queries>
         <intent>
             <action android:name="android.intent.action.VIEW" />
             <data android:scheme="tel" />
         </intent>
     </queries>
   <application

3.将url_launcher导入到您的文件中:例如 import 'package:url_launcher/url_launcher.dart';

4.代码

Future<void> _dialNumber(String phoneNumber) async {
final Uri launchUri = Uri(
scheme: 'tel',
path: phoneNumber,
);
await launchUrl(launchUri);
}

Source: url_launcher


Info.plistAndoridManifiest这两个步骤非常有帮助。谢谢。 - undefined

3

URL启动器已更新其依赖项,因此这是更新后执行此任务的方法,它适用于Android和iOS。

final Uri launchUri = Uri(
  scheme: 'tel',
  path: number,
);
await launchUrl(launchUri);

如果您没有使用过这个插件,只需导入此插件即可。

UrlLauncher


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接