【问题标题】:How can I make a direct PHONE CALL in Flutter如何在 Flutter 中直接拨打电话
【发布时间】:2019-05-16 13:52:01
【问题描述】:

我需要直接拨打电话,但它只是打开电话应用拨号器。
没有直接拨打电话。

事实上,我也尝试使用url_launcher 包来完成这项任务,但得到了相同的结果。

    _launchURL() async {
    SimplePermissions.requestPermission(Permission.CallPhone)
        .then((state) async {
      if (state == PermissionStatus.authorized) {
        String a = Uri.encodeFull("#");
        String url = 'tel:*123' + a;
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    });}

以前有人解决过这个问题吗?

【问题讨论】:

  • 是的,您想在 Android 设备上拨打电话--> 它会打开拨号器。您不能在 Android 设备上拨打“静音”电话。
  • ACTION_CALL 我认为在原生 android 中工作。
  • ACTION_CALL 操作要求您将 CALL_PHONE 权限添加到清单文件中。你这样做了吗?
  • 完美答案在此预览:stackoverflow.com/a/62359433/10563627

标签: android ios flutter android-intent


【解决方案1】:

特殊字符需要使用 URL 编码。

像这样:

launch("tel:" + Uri.encodeComponent('*123#'));

【讨论】:

    【解决方案2】:

    免责声明:plugin作者在这里。

    自 Android API 级别 26 起,sendUssdRequest 方法被公开以发出静默 USSD 请求。

    我制作了一个名为 ussd_service 的 Flutter 插件,以便能够在 Flutter 应用程序中轻松地从 dart 访问它。可以通过以下方式使用:

    import 'package:ussd_service/ussd_service.dart';
    
    makeMyRequest() async {
      int subscriptionId = 1; // sim card subscription Id
      String code = "*21#"; // ussd code payload
      try {
        String ussdSuccessMessage = await UssdService.makeRequest(subscriptionId, code);
        print("succes! message: $ussdSuccessMessage");
      } on PlatformException catch (e) {
        print("error! code: ${e.code} - message: ${e.message}");
      }
    };
    
    makeMyRequest();
    

    希望这会有所帮助!如果您有任何问题,请告诉我Github repo 的问题。

    【讨论】:

    • 此用户(有问题)似乎有意拨打电话。证据,他使用了url_launcher,而ussd也没有。
    • @MwamiTovi 传递的字符串 ("tel:*123#") 表示预期的操作是发送 USSD 请求而不是发起电话呼叫。虽然可以通过弹出拨号应用程序来做到这一点,但我的回复解释了如何在 Android 的后台进行。
    • @SifaturRahman 这是因为你需要一个 main 在 dart 中的函数入口点。有关完整的工作示例,请参阅 pub.dev/packages/ussd_service#-example-tab-
    【解决方案3】:

    我专门为此目的制作了一个名为 flutter_phone_direct_caller 的插件。

    你可以这样使用它:

    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);
    }
    

    希望它可以帮助某人。

    【讨论】:

    • 插件(flutter_phone_direct_caller)在flutter 1.20.4中仍未定义。我不确定发生了什么
    【解决方案4】:

    将这些包添加到您的依赖项中:

    android_intent_plus: ^2.0.0
    permission_handler: ^8.1.4+2
    

    将它们导入您的 .dart 文件中:

    import 'package:android_intent_plus/android_intent.dart';
    import 'package:permission_handler/permission_handler.dart';
    

    在您的main() 函数中请求电话呼叫权限:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Permission.phone.request();
      runApp(const MyApp());
    }
    

    最后你可以像这样直接打电话:

    AndroidIntent intent = const AndroidIntent(
      action: 'android.intent.action.CALL',
      data: 'tel:2125551212',
    );
    await intent.launch();
    

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多