获得所有蜂窝塔的CID,LAC和信号强度

时间:2012-09-19 08:46:43

标签: java android gsm signal-strength cellid

目前,我正在使用网络中的单元格来实现我的Android。它比我想象的还要准确。但不如我想要的那么准确。所以我想要涉及比getNeighboringCellInfo更多的塔。我想得到每个塔的范围内的Cell ID和信号强度。每个网络运营商。有没有办法“ping”塔,所以他们用cellID,Lac和signalstrength回答?不知怎的,这必须是可能的。 我可以扫描2G和3G(和4G)并行吗?或者我可以以编程方式在它们之间切换? 有什么建议?希望我足够清楚......

2 个答案:

答案 0 :(得分:1)

似乎TelephonyManagergetNeighboringCellInfo()正是您要找的。

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

/* 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或以上版本不支持此类操作。

答案 1 :(得分:0)

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

    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. 您可以找到cellInfoWcdma.getCellIdentity().getLac()的LAC,与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感兴趣,则可以将其作为API级别> = 28的cellInfoWcdma.getCellIdentity().getMccString()获得,否则请使用cellInfoWcdma.getCellIdentity().getMcc()。请注意,您无法获得CDMA的MCC和MNC。

您可以创建自己的模型类,并通过使其成为对象(在我的评论中)来存储所需的所有值。将这些对象存储在列表中。不要忘记为清单添加权限。