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会发生什么:
因此,我相信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在后续版本中更改了其名称,该怎么办?
希望这能为您提供一些有用的信息 - 我想表明这可能是乍看之下更加棘手!
小智 23
我认为更好的方法是查询PackageManager以检测设备上是否有Telephony功能.如果设备有电话,则设备应该只具有电话功能.我在没有手机的Nexus 7上进行了测试,但它确实有效.我没有配备手机的设备来测试相反的情况.
PackageManager pm = getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)){
//has Telephony features.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21545 次 |
| 最近记录: |