我可以通过以下代码拨打一般电话号码:
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 回答
提供的代码应该已经适用于此,但您需要
CALL_PHONE
和CALL_PRIVILEGED
权限才能拨打紧急号码而不显示拨号盘 .Android Reference - Manifest Permission CALL_PRIVILEGED
一旦将其添加到清单中,您应该能够使用
ACTION_CALL
使用相同的代码来代替直接拨号:Try this
如果你使用
Action_Dial
那么它将直接打开dialpad
并直接打开Action_Call
将call
指定的数字 .Add permission
<uses-permission android:name="android.permission.CALL_PHONE" />
Note: Tested on
Lenovo K3 Note (
Marshmallow
)Motorola (
Lollipop
)Micromax A116 (
Kitkat 4.1.2
)使用 Action_Dial 因为
Action_Dial
将直接打开拨号盘,Action_Call
将直接拨打指定的号码 .Note: 意图不能用来拨打紧急号码 . 应用程序可以使用
ACTION_DIAL
拨打紧急号码 .您需要
CALL_PHONE
和CALL_PRIVILEGED
权限才能拨打紧急号码而不显示拨号盘 .添加权限后,请使用
ACTION_CALL
尝试使用以下代码直接拨打:Android Reference - Manifest Permission CALL_PRIVILEGED
只是为了给你一个提醒,它已成为标准,特别是在欧洲,所有紧急号码自动路由到:112 . 要将此更改为世界上不同的紧急号码,(因为美国例如使用911)我将使用区域设置获取当前区域,然后调用特定于该区域的紧急号码 .
这可以通过if语句轻松实现 .
然后使用下面的代码实现调用部分:
如您所述,不要忘记将权限添加到清单文件,否则应用程序将崩溃:
希望这可以帮助 :)
我测试了一个有效的东西......
您必须检测电话号码是否为紧急号码(它们是在SIM卡中编码的),然后在号码的末尾添加“”,如果是的话 . 我测试了其他标志或数字,它没有工作(呼叫已完成,但它没有达到服务) .
我把她的代码从Orasi(一个视障人士的软件)中提取出来:
GetUriForCall对标志进行编码 . 我还把代码放在这里:
我在法国,我用'112'测试,这被视为紧急号码 . 有用 !
请注意,通常的紧急情况编号,即15(SAMU),18(消防部门)和17(警察)不被SIM卡视为紧急情况编号,并且作为正常编号工作 . 此外,911被视为一个,即使你不能在这里打电话给这个号码的人......
所以我认为在添加''之前测试数字很重要 . 另请注意,我编码'*'和'#',而不是'',因此它可以解释为什么这不适用于这些符号 .
希望这可以帮助
清单中无需许可 . 呼叫紧急拨号器意图:
权限需要
CALL_PHONE
和CALL_PRIVILEGED
是需要调用 . 有用 .请阅读Android框架的源代码行212-219:
https://android.googlesource.com/platform/packages/services/Telecomm/+/ec2a7d46128888f025dc3248d083043b978a46f4/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
引用Android文档以获取权限
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
紧急号码要求用户自己开火 .
拨打911(美国)是一个可以产生费用的错误 .
我在一个项目中工作,当用户摔倒时,他会拨打911 . 显然,这是针对老年人和/或受伤的人 . 当他跌倒时,紧急号码被呼叫 .
您现在有两个选项来模拟“人类行为”作为基本AI .
1)拨打后,单击呼叫按钮
查看手机应用程序Android Samples并设置一个警报,在呼叫按钮上执行clic . 该示例将为您提供按钮ID .
2)按照API 23模式请求权限(以及用户允许它):https://developer.android.com/training/permissions/requesting.html
在这种情况下,清单是不够的 .
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
仅授予系统应用程序 . 您需要将您的应用安装为系统应用 . Here是一个体面的教程 .尝试以下代码,你会得到你的答案
并且你可以给予许可