【发布时间】:2021-12-16 22:37:00
【问题描述】:
背景
我正在开发一个实现InCallService 的应用,因此它可以处理电话
问题
在具有多 SIM 卡的设备上,我需要显示使用哪个 SIM 卡和相关电话号码的信息(当前设备)。
问题是,我找不到从哪里获得这些信息。
我发现了什么
-
鉴于我达到了onCallAdded 之类的功能,我得到了一个Call 类的实例,所以我需要将我从那里得到的东西关联到一个 SIM 卡插槽和电话号码。
-
使用
call.getDetails().getHandle(),我可以获得一个 Uri,其中仅包含另一个呼叫者的电话号码(呼叫当前用户或当前用户呼叫的人)。 -
我可以遍历所有 SIM 卡,但找不到可以用来在它们和当前通话之间映射的内容:
final TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
for (final SubscriptionInfo subscriptionInfo : subscriptionManager.getActiveSubscriptionInfoList()) {
final TelephonyManager subscriptionId = telephonyManager.createForSubscriptionId(subscriptionInfo.getSubscriptionId());
}
-
有一个旧代码不再使用
call.getDetails().getAccountHandle().getId()和SubscriptionManager.from(context)getActiveSubscriptionInfoList().getActiveSubscriptionInfoList()。 -
我想我可以使用
telephonyManager.getSubscriptionId(callDetails.getAccountHandle()),但它需要 API 30,这是相当新的...
问题
给定我从这个回调(可能还有其他)收到的一个电话,我怎样才能得到它的关联 SIM 插槽和电话号码?
我更喜欢知道如何为尽可能广泛的 Android 版本执行此操作,因为 InCallService 来自 API 23……在 API 30 之前应该可以,对吧?
【问题讨论】:
-
TelecomManager.getPhoneAccount()有效吗? -
@vlp 它实际上似乎运作良好!可悲的是,我无法在旧设备上进行测试(没有任何设备),并且模拟器不能拥有多 SIM 卡,但它看起来很有希望。我用它来获取电话号码:telecomManager.getPhoneAccount(call.details.accountHandle)?.address?.schemeSpecificPart 然后我从 number 字段中的 subscriptionManager.activeSubscriptionInfoList 列表中找到它。你为什么不把它写在答案里?你是怎么知道的?我试图搜索它几个小时......
-
说实话——我在官方文档中读到过它,但从未尝试过。我很高兴它对你有用。祝你的项目好运!
-
@vlp 请写下你从哪里得到的答案。
-
我从 Android 官方文档中获得了这些信息。
标签: android phone-call sim-card incallservice