Android设备通话功能

ste*_*e y 32 android android-intent

如何判断某台设备是否具有拨打电话的权限?

例如,我的Galaxy Tablet不能,它不是手机.我想在打电话之前检测到isIntentAvailable(context, Intent.ACTION_DIAL).我试过检查isIntentAvailable这个,但这似乎不是要走的路.

Ted*_*opp 49

if (((TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE)).getPhoneType()
    == TelephonyManager.PHONE_TYPE_NONE)
{
    // no phone
}
Run Code Online (Sandbox Code Playgroud)

编辑我很惊讶它回来了PHONE_TYPE_CDMA.这是另一种可能性:

if (((TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number()
    == null)
{
    // no phone
}
Run Code Online (Sandbox Code Playgroud)

这将需要READ_PHONE_STATE许可.


Dan*_*n J 30

设备不一定需要Context.TELEPHONY_SERVICE拨打电话.考虑一下如果安装Skype会发生什么:

  • 在原生Dialer/Phone应用程序中输入电话号码,然后按"呼叫".
  • 弹出窗口显示标题为"使用完整操作"并提供"拨号器"或"Skype"应用程序(它也可以列出其他应用程序).

因此,我相信Skype可以在没有手机功能的无线设备上工作(据称Context.TELEPHONY_SERVICE).

我认为你的原始想法是正确的,但你需要检查注册的应用程序,Intent.ACTION_CALL而不是Intent.ACTION_DIAL,例如

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:5551231234"));
List<ResolveInfo> callAppsList = 
  context.getPackageManager().queryIntentActivities(callIntent, 0);
Run Code Online (Sandbox Code Playgroud)

但是,我不知道有任何可靠的,前瞻性的方法来确定这些应用程序是否能够处理电话呼叫.考虑这些情况:

1)安装了Skype的仅限wifi的Xoom.它需要有效的WiFi连接,并且用户必须已配置Skype才能使用其帐户,否则呼叫将无法成功.

2)没有插入SIM卡的电话启用设备,或者已锁定或已用完的SIM卡.设备认为它可以处理电话,但是呼叫导致"未在网络上注册"错误.

3)启用电话的设备没有wifi或移动连接(或者因为它处于飞机/飞行模式).设备认为它可以处理电话,但呼叫将失败.

有一些方法可以检测到其中一些情况(例如检查getSystemService(Context.TELEPHONY_SERVICE).getSimState()),但我认为这可能会导致脆弱的代码在未来发生变化时可能会破坏.例如,您是否可以始终可靠地检测列表中的哪个应用程序是默认的拨号器/电话应用程序?如果Android在后续版本中更改了其名称,该怎么办?

希望这能为您提供一些有用的信息 - 我想表明这可能是乍看之下更加棘手!

  • 事实证明`ACTION_CALL`并非万无一失.我尝试在我开箱即用的ASUS Eee Pad Transformer TF101 16GB运行Android 3.2.1上查询这个意图,这是目前市场上最受欢迎的Android平板电脑之一.此设备没有电话功能.出乎意料的是,它返回一个单一的意图,由类com.android.phone.PhoneApp`标识.我期待0.我推测PhoneApp是通过在此设备上显示"电话号码:[XXX] XXX-XXXX"[添加到联系人] [关闭] dlg来处理拨号尝试(类似于iOS Touch设备所做的). (2认同)

小智 23

我认为更好的方法是查询PackageManager以检测设备上是否有Telephony功能.如果设备有电话,则设备应该只具有电话功能.我在没有手机的Nexus 7上进行了测试,但它确实有效.我没有配备手机的设备来测试相反的情况.

PackageManager pm = getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)){
    //has Telephony features.
}
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!(通过禁用平板电脑上的手机应用程序进行测试).可以在智能手机上使用.您甚至不需要READ_PHONE_STATE权限. (2认同)