有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取范围内所有基站的CID、LAC和信号强度

目前,我正在用网络中的细胞对我的Android进行三边测量。这比我想象的还要准确。但没有我希望的那么准确。所以我想让更多的塔参与进来,而不是从GetNeighborringCellInfo获得的。我想得到范围内每个塔的细胞ID和信号强度。每一个网络运营商。有没有办法“ping”这些塔,让它们用cellID、Lac和signalstrength来回答?无论如何,这是可能的。 我可以扫描2G和3G(以及4G)并行设备吗?或者我可以通过编程在它们之间切换吗? 有什么建议吗?希望我足够清楚


共 (2) 个答案

  1. # 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或更高版本不支持此类操作

  2. # 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. 你可以用cellInfoWcdma.getCellIdentity().getLac()找到LAC,同样地,也可以用cellInfoGsmcellInfoLte找到LAC。请注意,CDMA不包含LAC。还要注意的是,LTE有TAC而不是LAC,除了它们的术语之外,它们是相似的

    2. 你可以在^{中找到力量。LTE、GSM和CDMA也是如此。请注意,您可以getLevelgetDbmgetAsuLevel任何您感兴趣的内容

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

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

    您可以创建自己的模型类,并通过创建它们的对象(我已经在这里发表了评论)来存储所需的所有值。将这些对象存储在列表中。别忘了向清单添加权限