首页 文章

如何以编程方式拨打紧急电话号码

提问于
浏览
10

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

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的doc解释 CALL_PRIVILEGED 这样:允许应用程序拨打任何电话号码,包括紧急号码,而无需通过拨号器用户界面,以便用户确认正在拨打的电话 . 不供第三方应用程序使用 .

我的应用程序位于 packages/apps ,因此它不是第三方应用程序,对吧?那么,为什么每次拨打像'112'这样的紧急号码时,我仍然直接拨打拨号盘而不是拨号用户界面?

12 回答

  • 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);
    
  • 0

    Try this

    如果你使用 Action_Dial 那么它将直接打开 dialpad 并直接打开 Action_Callcall 指定的数字 .

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

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

    Note: Tested on

    • Lenovo K3 NoteMarshmallow

    • MotorolaLollipop

    • Micromax A116Kitkat 4.1.2

  • 0

    使用 Action_Dial 因为 Action_Dial 将直接打开拨号盘, Action_Call 将直接拨打指定的号码 .

    Note: 意图不能用来拨打紧急号码 . 应用程序可以使用 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

  • 8

    只是为了给你一个提醒,它已成为标准,特别是在欧洲,所有紧急号码自动路由到: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"/>
    

    希望这可以帮助 :)

  • 2

    我测试了一个有效的东西......

    您必须检测电话号码是否为紧急号码(它们是在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被视为一个,即使你不能在这里打电话给这个号码的人......

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

    希望这可以帮助

  • 0

    清单中无需许可 . 呼叫紧急拨号器意图:

    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 ...
    }
    
  • 0
    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 是需要调用 . 有用 .

  • 0

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

    允许应用程序拨打任何电话号码,包括紧急号码,而无需通过拨号器用户界面,以便用户确认正在拨打电话 . 不适用于第三方应用程序 . 常量值:“android.permission.CALL_PRIVILEGED”

    重要的部分: Not for use by third-party applications.

    因此, it is not possible 使用非root用户的Android操作系统 .

    但是,如果它是root用户,你可以将你的应用程序变成一个系统应用程序,这样就行了 .

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

  • 6

    紧急号码要求用户自己开火 .

    拨打911(美国)是一个可以产生费用的错误 .

    我在一个项目中工作,当用户摔倒时,他会拨打911 . 显然,这是针对老年人和/或受伤的人 . 当他跌倒时,紧急号码被呼叫 .

    您现在有两个选项来模拟“人类行为”作为基本AI .

    1)拨打后,单击呼叫按钮

    查看手机应用程序Android Samples并设置一个警报,在呼叫按钮上执行clic . 该示例将为您提供按钮ID .

    2)按照API 23模式请求权限(以及用户允许它):https://developer.android.com/training/permissions/requesting.html

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

  • 1

    <uses-permission android:name="android.permission.CALL_PRIVILEGED"/> 仅授予系统应用程序 . 您需要将您的应用安装为系统应用 . Here是一个体面的教程 .

  • 0

    尝试以下代码,你会得到你的答案

    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" />
    

相关问题