目前,我正在使用网络中的单元格来实现我的Android。它比我想象的还要准确。但不如我想要的那么准确。所以我想要涉及比getNeighboringCellInfo更多的塔。我想得到每个塔的范围内的Cell ID和信号强度。每个网络运营商。有没有办法“ping”塔,所以他们用cellID,Lac和signalstrength回答?不知怎的,这必须是可能的。 我可以扫描2G和3G(和4G)并行吗?或者我可以以编程方式在它们之间切换? 有什么建议?希望我足够清楚......
答案 0 :(得分:1)
似乎TelephonyManager
和getNeighboringCellInfo()
正是您要找的。 p>
这是一个简单直接的例子:
/* 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或以上版本不支持此类操作。
答案 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 */
}
}
现在
您可以找到cellInfoWcdma.getCellIdentity().getLac()
的LAC,与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感兴趣,则可以将其作为API级别> = 28的cellInfoWcdma.getCellIdentity().getMccString()
获得,否则请使用cellInfoWcdma.getCellIdentity().getMcc()
。请注意,您无法获得CDMA的MCC和MNC。
您可以创建自己的模型类,并通过使其成为对象(在我的评论中)来存储所需的所有值。将这些对象存储在列表中。不要忘记为清单添加权限。