目前,我正在使用网络中的单元对我的 Android 进行三边测量。它比我想象的还要准确。但没有我想要的那么准确。所以我想参与的塔比从 getNeighboringCellInfo 获得的要多。我想获取范围内每个塔的 Cell ID 和信号强度。每个网络运营商。有没有办法“ping”塔,所以他们用 cellID、Lac 和信号强度来回答?不知何故,这必须是可能的。我可以同时扫描 2G 和 3G(和 4G)吗?或者我可以以编程方式在它们之间切换吗?有什么建议么?希望我足够清楚...
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_LOCATION
或READ_PHONE_STATE
,具体取决于您将使用的 API,否则它会简单地崩溃。
哦顺便说一句,这只适用于2G。3G及以上不支持这种操作。
到目前为止,这是获取相邻小区信息的正确方法:
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 */
}
}
现在,
您可以找到 LAC 为
cellInfoWcdma.getCellIdentity().getLac()
,类似地为cellInfoGsm
和cellInfoLte
。请注意,CDMA 不包含 LAC。另请注意,LTE 具有 TAC 而不是 LAC,它们相似,但术语不同。你可以找到力量
cellInfoWcdma.getCellSignalStrength().getLevel()
。LTE、GSM 和 CDMA 也是如此。请注意,您可以getLevel
,getDbm
或getAsuLevel
,任何您感兴趣的内容。对于 CID,您可以将其获取为
cellInfoWcdma.getCellIdentity().getCid()
,与 LTE 和 GSM 类似。请注意,LTE 具有getCi
而不是getCid
. 另请注意,它不适用于 CDMA。如果您对 MCC 和 MNC 感兴趣,您可以获取
cellInfoWcdma.getCellIdentity().getMccString()
API Level >= 28,否则使用cellInfoWcdma.getCellIdentity().getMcc()
. 请注意,您无法获得 CDMA 的 MCC 和 MNC。
您可以制作自己的模型类并通过制作对象来存储您需要的所有值(我已经评论过)。将这些对象存储在列表中。不要忘记向 Manifest 添加权限。