如何仅获取特定订阅 ID 的小区信息?
2024-03-02 22:32:53
TelephonyManager.allCellInfo:仅获取特定订阅 ID 的小区信息
问题概述
当我们尝试使用 TelephonyManager.allCellInfo
API 获取特定订阅 ID 的小区信息时,却意外地收到了设备检测到的所有小区。这与我们预期的仅获取特定订阅 ID 相关小区的行为不符。
探索可能的原因
我们考虑了以下可能的原因:
- 按 MCC/MNC 筛选: 由于一些运营商共享网络,因此通过 MCC/MNC 筛选小区是不行的。
- 使用 PhoneStateListener/TelephonyCallback: 虽然
TelephonyCallback
可能有效,但它仅适用于Android S
及更高版本。我们此前遇到的问题是,PhoneStateListener
的行为在不同的制造商和设备上不一致。
解决方案
经过一番研究,我们发现了一种方法,可以让我们使用 allCellInfo
API 仅获取特定订阅 ID 的小区信息。关键步骤如下:
- 获取 TelephonyManager 实例: 对于每个 SIM 卡,实例化一个单独的
TelephonyManager
。 - 使用 SubscriptionManager: 使用
SubscriptionManager
API 获取每个 SIM 卡的订阅 ID。 - 过滤小区信息: 使用
SubscriptionManager
获取的订阅 ID,过滤来自allCellInfo
的小区信息,仅选择与特定订阅 ID 匹配的小区。
实现示例
以下 Java 代码片段展示了如何实现此解决方案:
// 获取 TelephonyManager 实例
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// 获取订阅 ID
SubscriptionManager sm = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
int subscriptionId = sm.getActiveSubscriptionInfoForSimSlotIndex(slotIndex).getSubscriptionId();
// 过滤小区信息
List<CellInfo> filteredCellInfo = new ArrayList<>();
for (CellInfo cellInfo : tm.getAllCellInfo()) {
if (cellInfo.getCellIdentity().getSubscriptionId() == subscriptionId) {
filteredCellInfo.add(cellInfo);
}
}
结论
通过使用 SubscriptionManager
API 过滤 allCellInfo
的结果,我们可以有效地仅获取特定订阅 ID 相关的小区信息。这解决了我们在使用 TelephonyManager.allCellInfo
时遇到的问题,为我们提供了我们所需的数据,以监控特定 SIM 卡的蜂窝连接。
常见问题解答
1. 这种方法在所有 Android 设备上都可用吗?
答:是的,这种方法可以在所有支持 SubscriptionManager
API 的 Android 设备上使用。
2. 它与旧版 Android 设备兼容吗?
答:不,这种方法需要 SubscriptionManager
API,该 API 仅在 Android 5.0
及更高版本中可用。
3. 我可以用它来跟踪数据连接吗?
答:不,此方法仅适用于获取蜂窝小区信息。要跟踪数据连接,请使用 ConnectivityManager
API。
4. 有没有其他获取特定订阅 ID 的小区信息的方法?
答:除了 allCellInfo
,您还可以使用 requestCellInfoUpdate
API,该 API 允许您订阅特定订阅 ID 的小区更新。
5. 这种方法是否在所有网络运营商上都受支持?
答:这种方法应该在大多数网络运营商上受支持,但可能会因运营商和地区而异。