You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过编程方式获取VoLTE启用状态?通话APP开发求助

获取VoLTE启用状态的实用方案(自定义通话APP适配)

嘿,我刚好有过帮开发者做自定义通话APP适配VoLTE状态的经验,结合你提到的SubscriptionManagerTelephonyManager这些系统API,给你整理几个能解决问题的方案,完美覆盖你说的三个场景:

一、提前获取VoLTE启用状态(通话按钮场景)

要在通话按钮上显示VoLTE图标,你需要提前判断当前卡槽的VoLTE是否已启用,用TelephonyManager就能直接拿到:

  1. 首先确保你已经申请了READ_PHONE_STATE权限(Android 6+要动态申请,Android 10+注意权限适配);
  2. 结合SubscriptionManager拿到目标卡槽的subscriptionId,然后调用:
// 获取系统TelephonyManager实例
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// 针对指定卡槽创建实例(subscriptionId从SubscriptionManager获取)
TelephonyManager slotTelephonyManager = telephonyManager.createForSubscriptionId(subscriptionId);
// 直接获取VoLTE启用状态
boolean isVoLTEEnabled = slotTelephonyManager.isVoLTEEnabled();

拿到这个状态后,就可以在通话按钮旁显示对应的VoLTE图标了。

二、实时判断VoLTE通话状态(通话中界面场景)

通话中要显示VoLTE图标,最可靠的方式是通过InCallService监听通话的属性:
在你的InCallService实现类中,重写onCallAdded方法,直接从通话详情里获取VoLTE标识:

@Override
public void onCallAdded(Call call) {
    super.onCallAdded(call);
    // 判断当前通话是否为VoLTE通话
    boolean isVoLTECall = call.getDetails().getCallProperties().contains(Call.Details.PROPERTY_VOLTE);
    // 根据这个结果更新通话中界面的图标显示
}

这个方法能实时准确获取当前通话的VoLTE状态,和系统默认通话APP的逻辑一致。

三、从通话记录中提取VoLTE标识(通话记录场景)

要在通话记录里显示VoLTE图标,你可以通过TelecomManager查询通话记录时,获取每条记录的CallDetails

TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
// 查询通话记录(需要READ_CALL_LOG权限)
List<CallLogEntry> callLogs = telecomManager.getCallLog(null);
for (CallLogEntry entry : callLogs) {
    Call.Details details = entry.getDetails();
    if (details != null && details.getCallProperties().contains(Call.Details.PROPERTY_VOLTE)) {
        // 这条是VoLTE通话记录,显示对应的图标
    }
}

注意这里需要申请READ_CALL_LOG权限,才能读取通话记录的详细属性。

补充:结合运营商配置做更准确的判断

有时候用户启用了VoLTE,但运营商可能不支持该功能,你可以用CarrierConfigManager补充验证:

CarrierConfigManager carrierConfigManager = (CarrierConfigManager) getSystemService(Context.CARRIER_CONFIG_SERVICE);
Bundle carrierConfig = carrierConfigManager.getConfigForSubscriptionId(subscriptionId);
// 判断运营商是否支持VoLTE
boolean isVoLTESupportedByCarrier = carrierConfig.getBoolean(CarrierConfigManager.KEY_VOLTE_AVAILABLE_BOOL);

把这个结果和isVoLTEEnabled结合,就能避免显示错误的VoLTE状态。

多卡槽适配小贴士

因为你需要获取卡槽编号,记得用SubscriptionManager遍历所有活跃的SIM卡:

SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> activeSubscriptions = subscriptionManager.getActiveSubscriptionInfoList();
if (activeSubscriptions != null) {
    for (SubscriptionInfo info : activeSubscriptions) {
        int slotId = info.getSlotIndex(); // 卡槽编号
        int subscriptionId = info.getSubscriptionId(); // 对应的subscriptionId
        // 用上面的方法获取该卡槽的VoLTE状态
    }
}

最后提醒下,不同厂商可能有一些定制化的VoLTE逻辑,但上面的方法都是基于Android公开API的,兼容性比较有保障。

内容的提问来源于stack exchange,提问作者Brian917

火山引擎 最新活动