5

目前,我正在使用网络中的单元对我的 Android 进行三边测量。它比我想象的还要准确。但没有我想要的那么准确。所以我想参与的塔比从 getNeighboringCellInfo 获得的要多。我想获取范围内每个塔的 Cell ID 和信号强度。每个网络运营商。有没有办法“ping”塔,所以他们用 cellID、Lac 和信号强度来回答?不知何故,这必须是可能的。我可以同时扫描 2G 和 3G(和 4G)吗?或者我可以以编程方式在它们之间切换吗?有什么建议么?希望我足够清楚...

4

2 回答 2

2

似乎TelephonyManager并且getNeighboringCellInfo()是您正在寻找的东西。

这是一个简单直接的示例:

/* first you wanna get a telephony manager by asking the system service */
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

/* then you can query for all the neighborhood cells */
List<NeighboringCellInfo> neighbors = tm.getNeighboringCellInfo();

/* here's something you can get from NeighboringCellInfo */
for (NeighboringCellInfo n : neighbors) {
    Log.v("CellInfo", "" + n.getCid());
    Log.v("CellInfo", "" + n.getLac());
    Log.v("CellInfo", "" + n.getPsc());
    Log.v("CellInfo", "" + n.getRssi());
}

确保在清单文件中包含所有所需的权限,例如ACCESS_COARSE_LOCATIONREAD_PHONE_STATE,具体取决于您将使用的 API,否则它会简单地崩溃。

哦顺便说一句,这只适用于2G。3G及以上不支持这种操作。

于 2012-11-12T08:33:18.633 回答
2

到目前为止,这是获取相邻小区信息的正确方法:

    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    List<CellInfo> cellInfoList = telephonyManager.getAllCellInfo();
    for (int i = 0; i < cellInfoList.size(); i++) {
        if (cellInfoList.get(i) instanceof CellInfoWcdma) {
            CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) cellInfoList.get(i);
            /* Get LAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoGsm) {
            CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfoList.get(i);
            /* Get LAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoLte) {
            CellInfoLte cellInfoLte = (CellInfoLte) cellInfoList.get(i);
            /* Get TAC, strength etc. here */
        } else if (cellInfoList.get(i) instanceof CellInfoCdma) {
            CellInfoCdma cellInfoCdma = (CellInfoCdma) cellInfoList.get(i);
            /* Get strength etc. here */
        }
    }

现在,

  1. 您可以找到 LAC 为cellInfoWcdma.getCellIdentity().getLac(),类似地为cellInfoGsmcellInfoLte。请注意,CDMA 不包含 LAC。另请注意,LTE 具有 TAC 而不是 LAC,它们相似,但术语不同。

  2. 你可以找到力量cellInfoWcdma.getCellSignalStrength().getLevel()。LTE、GSM 和 CDMA 也是如此。请注意,您可以getLevelgetDbmgetAsuLevel,任何您感兴趣的内容。

  3. 对于 CID,您可以将其获取为cellInfoWcdma.getCellIdentity().getCid(),与 LTE 和 GSM 类似。请注意,LTE 具有getCi而不是getCid. 另请注意,它不适用于 CDMA。

  4. 如果您对 MCC 和 MNC 感兴趣,您可以获取cellInfoWcdma.getCellIdentity().getMccString()API Level >= 28,否则使用cellInfoWcdma.getCellIdentity().getMcc(). 请注意,您无法获得 CDMA 的 MCC 和 MNC。

您可以制作自己的模型类并通过制作对象来存储您需要的所有值(我已经评论过)。将这些对象存储在列表中。不要忘记向 Manifest 添加权限。

于 2019-08-02T09:38:50.890 回答