我可以通过以下代码拨打一般电话号码:
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”这样的紧急号码时,我仍然直接拨打拨号盘而不是拨号用户界面?
答案 0 :(得分:8)
提供的代码应该已经可以使用,但您需要CALL_PHONE
和CALL_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
,则会直接打开dialpad
,Action_Call
将call
直接打开指定的号码。
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" />
注意:经过测试
Marshmallow
)Lollipop
)Kitkat 4.1.2
)答案 2 :(得分:2)
使用 Action_Dial ,因为Action_Dial
将直接打开拨号盘,Action_Call
将直接拨打指定的号码。
注意:意图不能用于拨打紧急号码。应用程序可以使用ACTION_DIAL
拨打紧急号码。
您需要CALL_PHONE
和CALL_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);
答案 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)
请阅读Android框架的源代码行212-219:
答案 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);