【问题标题】:How can I call emergency number programmatically如何以编程方式拨打紧急号码
【发布时间】:2013-12-25 07:05:40
【问题描述】:

我可以通过以下代码拨打通用电话号码:

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("tel:" + phoneNumber));
startActivity(intent);  

在清单文件中,我添加如下权限:

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

正如 android 的文档所解释的 CALL_PRIVILEGED 如下:允许应用程序拨打任何电话号码,包括紧急号码,而无需通过拨号器用户界面让用户确认正在拨打的电话.不供第三方应用程序使用。

而且我的应用位于packages/apps,所以它不是第三方应用,对吧?那么,为什么我每次拨打紧急电话(例如“112”)时还是直接进入拨号盘而不是拨号用户界面?

【问题讨论】:

  • 看看我的回答对你有帮助。
  • 以下提示都不适合我,所以我开了一个赏金。 android.permission.CALL_PRIVILEGED 仅限于系统应用。 Intent.FLAG_ACTIVITY_NO_USER_ACTION) 对...没有影响
  • 您在哪个设备上工作/测试?

标签: android phone-call


【解决方案1】:

提供的代码应该已经可以解决这个问题,但您需要CALL_PHONECALL_PRIVILEGED 权限才能在不显示拨号盘的情况下拨打紧急号码。

Android Reference - Manifest Permission CALL_PRIVILEGED

将其添加到清单后,您应该能够使用相同的代码使用 ACTION_CALL 代替直接拨号:

Uri callUri = Uri.parse("tel://911");
Intent callIntent = new Intent(Intent.ACTION_CALL,callUri);
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);
startActivity(callIntent);

【讨论】:

  • 亲爱的,当我添加 CALL_PRIVILEGED 权限时,它显示错误“权限仅授予系统应用程序”?
【解决方案2】:

试试这个

如果你使用Action_Dial,那么它会直接打开dialpadAction_Call会直接打开指定号码上的call

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("tel:" + "198"));
startActivity(intent);

添加权限 &lt;uses-permission android:name="android.permission.CALL_PHONE" /&gt;

注意:测试于

  1. 联想 K3 Note(Marshmallow)
  2. 摩托罗拉 (Lollipop)
  3. Micromax A116 (Kitkat 4.1.2)

【讨论】:

    【解决方案3】:

    使用Action_Dial,因为Action_Dial会直接打开拨号盘,Action_Call会直接拨打指定号码。

    注意: Intent 不能用于拨打紧急号码。应用程序可以使用ACTION_DIAL 拨打紧急号码。

    您需要CALL_PHONECALL_PRIVILEGED 权限才能在不显示拨号盘的情况下拨打紧急号码。

    添加权限后,请尝试以下代码,使用ACTION_CALL 代替直接拨号:

    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);
     callIntent.setData(Uri.parse("tel:" + phoneNumber));
    startActivity(callIntent);
    

    Android Reference - Manifest Permission CALL_PRIVILEGED

    【讨论】:

    • 我只是想拨打紧急电话,但没有打开拨号盘,tks
    【解决方案4】:

    我在 Android OS 10(Q) 中也面临类似的问题,

    W/Telecom:NewOutgoingCallIntentBroadcaster:无法使用 CALL Intent Intent { act=android.intent.action.CALL dat=tel:xxx flg=0x10000000 pkg=com.android.server.telecom cmp=com 拨打潜在的紧急号码 911。 android.server.telecom/.components.UserCallActivity (has extras) } 除非调用者是系统或默认拨号器。:TSI.hCI->CIP.sNOCI@AO8

    在这种情况下,下面是我的发现和修复。我希望这会对某人有所帮助。

        Intent intent;
        if (PhoneUtil.isEmergencyNumber(number)) {
            intent = new Intent("com.android.phone.EmergencyDialer.DIAL");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_NO_USER_ACTION);
            intent.setData(Uri.parse("tel:Your Emergency number "));
    
        } else {
            intent = new Intent(Intent.ACTION_CALL);
            intent.setPackage("com.android.server.telecom");
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("tel:Your number"));
    
        }
        startActivity(intent);
    

    【讨论】:

      【解决方案5】:

      提醒您一下,所有紧急电话号码都自动路由到:112 已成为标准,尤其是在欧洲。要将其更改为世界上不同的紧急电话号码,(例如,美国使用911)我会使用区域设置来获取当前区域,然后拨打特定于该区域的紧急电话号码。

      这可以通过 if 语句轻松实现。

      然后使用下面的代码来实现调用部分:

      Uri callUri = Uri.parse("tel://emergencyNum");
      Intent callIntent = new Intent(Intent.ACTION_CALL,callUri);
      callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);
      startActivity(callIntent);
      

      正如你所说,不要忘记在清单文件中添加权限,否则应用程序会崩溃:

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

      希望这会有所帮助:)

      【讨论】:

      • 嗨!您如何获得特定国家/地区的紧急情况(特别是救护车号码)?你有 switch/map 对 country=phone 还是从 Android 框架获取电话号码?谢谢!
      • 有几个 API 可以为您做到这一点。以下是其中之一:programmableweb.com/api/emergency-number
      • 感谢您的帮助!
      【解决方案6】:

      紧急号码要求用户自己触发操作。

      拨打 911(美国)是一个错误,可能会产生费用。

      我曾参与过一个在用户跌倒时拨打 911 的项目。显然,它是为老年人和/或受伤的人准备的。当他跌倒时,会拨打紧急电话。

      您现在有两个选项可以将“人类行为”模拟为基本 AI。

      1) 拨号后单击通话按钮

      查看电话应用 Android 示例并设置一个警报,该警报在通话按钮上执行 clic。该示例将为您提供按钮 ID。

      2) 按照 API 23 模式请求许可(并且用户必须允许):https://developer.android.com/training/permissions/requesting.html

      在这种情况下,清单是不够的。

      【讨论】:

        【解决方案7】:

        我已经测试了一个可行的东西......

        您必须检测电话号码是否为紧急电话号码(它们已编码在 SIM 卡中),如果是,则在号码末尾添加一个“+”。我用其他符号或数字测试,它没有工作(呼叫完成,但它没有到达服务)。

        我把我来自 Orasi(视障人士的软件)的代码放给了她:

        // Lance un appel
        public static void CallNumber(Activity activity, String szNumber) {
            Intent intent = new Intent(Intent.ACTION_CALL);
            if(PhoneNumberUtils.isEmergencyNumber(szNumber)) {
                szNumber += "+";
            }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);
            intent.setData(GetUriForCall(szNumber));
            activity.startActivity(intent);
        }
        

        GetUriForCall 对符号进行编码。我也把代码放在这里:

        // Retourne une URI pour appel téléphonique, avec adaptation encodage caratères
        public static Uri GetUriForCall(String szNumber) {
            String szOutNumber = szNumber.replace("*", Uri.encode("*")).replace("#",Uri.encode("#"));
            return Uri.parse("tel:" + szOutNumber);
        }
        

        我在法国,我使用“112”进行了测试,这被视为紧急电话号码。它有效!

        请注意,常用的紧急电话号码,即 15(SAMU)、18(消防部门)和 17(警察)不会被 SIM 卡视为紧急电话号码,而是按正常号码工作。而且,911被视为一个,即使你在这里不能用这个号码打电话给某人......

        所以我认为在添加“+”之前测试数字很重要。 另请注意,我编码了“*”和“#”,而不是“+”,因此它可以解释为什么这不适用于这些符号。

        希望对你有帮助

        【讨论】:

          【解决方案8】:

          清单中不需要权限。呼叫紧急拨号器意图:

          try {
              Intent callIntent = new Intent("com.android.phone.EmergencyDialer.DIAL");
              callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                  Intent.FLAG_ACTIVITY_NO_USER_ACTION);
              callIntent.setData(Uri.parse("tel:112")); // < Optional, will prompt number for user
              startActivity(callIntent);
          } catch (Exception e) {
              // in case something went wrong ...
          }
          

          【讨论】:

            【解决方案9】:
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);
            callIntent.setData(Uri.parse("tel:" + any  number));
            startActivity(callIntent);
            

            权限需要CALL_PHONECALL_PRIVILEGED才能调用。 它有效。

            【讨论】:

              【解决方案10】:
              【解决方案11】:

              引用 Android 文档获取权限android.permission.CALL_PRIVILEGED

              允许应用拨打任何电话号码,包括紧急电话号码 号码,无需通过用户的拨号器用户界面 确认正在拨打的电话。

              不适用于第三方应用程序。

              常量值:“android.permission.CALL_PRIVILEGED”

              重要部分:不供第三方应用程序使用。

              因此,不可能使用非 root 的 Android 操作系统。

              但是,如果它被植根,您可以将您的应用程序变成系统应用程序,这将起作用。

              来源:https://developer.android.com/reference/android/Manifest.permission.html#CALL_PRIVILEGED

              【讨论】:

                【解决方案12】:

                &lt;uses-permission android:name="android.permission.CALL_PRIVILEGED"/&gt; 仅授予系统应用程序。您需要将您的应用程序安装为系统应用程序。 Here 是一个不错的教程。

                【讨论】:

                  【解决方案13】:

                  试试下面的代码你会得到答案

                  Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:112");
                                  try {
                                      startActivity(intent);
                                  } catch (android.content.ActivityNotFoundException ex) {
                                      Toast.makeText(getContext(), "Can't make a call", Toast.LENGTH_SHORT).show();
                                  }
                  

                  您可以给予许可

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-03-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-10-29
                    • 2012-01-28
                    相关资源
                    最近更新 更多