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

时间:2013-12-25 07:05:40

标签: android phone-call

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

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”这样的紧急号码时,我仍然直接拨打拨号盘而不是拨号用户界面?

13 个答案:

答案 0 :(得分:8)

提供的代码应该已经可以使用,但您需要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);

答案 1 :(得分:6)

试试这个

如果您使用Action_Dial,则会直接打开dialpadAction_Callcall直接打开指定的号码。

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

添加权限 <uses-permission android:name="android.permission.CALL_PHONE" />

注意:经过测试

  1. Lenovo K3 Note Marshmallow
  2. 摩托罗拉Lollipop
  3. Micromax A116 Kitkat 4.1.2

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

希望这会有所帮助:)

答案 4 :(得分:1)

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

您必须检测电话号码是否为紧急电话号码(它们是在SIM卡中编码的),然后添加一个&#39; +&#39;如果是这样的话,在数字的末尾。我测试了其他标志或数字,它没有工作(呼叫完成,但它没有达到服务)。

我把她的代码从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);
}

我在法国,并且我已经使用了&#39; 112&#39;这被视为紧急号码。它有效!

请注意,通常的紧急情况编号,即15(SAMU),18(消防部门)和17(警察)不会被SIM卡视为紧急情况编号,并且作为正常编号工作。此外,911被视为一个,即使你不能在这里打电话给这个号码的人...

所以我认为在添加&#39; +&#39;之前测试这个数字很重要。 请注意我编码&#39; *&#39;并且&#39;#&#39;而不是&#39; +&#39;,所以它可以解释为什么这不符合这些迹象。

希望这有帮助

答案 5 :(得分:1)

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

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 ...
}

答案 6 :(得分: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_PHONE,并且需要CALL_PRIVILEGED才能进行调用。    它有效。

答案 7 :(得分:0)

答案 8 :(得分:0)

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

  

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

     

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

     

常量值:“android.permission.CALL_PRIVILEGED”

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

因此,无法使用非root用户Android操作系统

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

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

答案 9 :(得分:0)

紧急电话号码要求用户自行解雇。

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

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

您现在有两个选项来模拟&#34;人类行为&#34;作为一个基本的AI。

1)拨打电话后点击呼叫按钮

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

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

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

答案 10 :(得分:0)

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

答案 11 :(得分: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" />

答案 12 :(得分:0)

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

电信: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(有附加功能)},除非呼叫者是系统或默认拨号器。: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);