返回

如何仅获取特定订阅 ID 的小区信息?

Android

TelephonyManager.allCellInfo:仅获取特定订阅 ID 的小区信息

问题概述

当我们尝试使用 TelephonyManager.allCellInfo API 获取特定订阅 ID 的小区信息时,却意外地收到了设备检测到的所有小区。这与我们预期的仅获取特定订阅 ID 相关小区的行为不符。

探索可能的原因

我们考虑了以下可能的原因:

  • 按 MCC/MNC 筛选: 由于一些运营商共享网络,因此通过 MCC/MNC 筛选小区是不行的。
  • 使用 PhoneStateListener/TelephonyCallback: 虽然 TelephonyCallback 可能有效,但它仅适用于 Android S 及更高版本。我们此前遇到的问题是,PhoneStateListener 的行为在不同的制造商和设备上不一致。

解决方案

经过一番研究,我们发现了一种方法,可以让我们使用 allCellInfo API 仅获取特定订阅 ID 的小区信息。关键步骤如下:

  1. 获取 TelephonyManager 实例: 对于每个 SIM 卡,实例化一个单独的 TelephonyManager
  2. 使用 SubscriptionManager: 使用 SubscriptionManager API 获取每个 SIM 卡的订阅 ID。
  3. 过滤小区信息: 使用 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. 这种方法是否在所有网络运营商上都受支持?
答:这种方法应该在大多数网络运营商上受支持,但可能会因运营商和地区而异。