我想通過TelephonyManager
類及其getNeighboringCellInfo
方法利用有關相鄰小區的移動信息,可在Android上使用。下面我發佈了一部分代碼(大部分來自公開可用的源代碼),它完成了這項工作,以及這個代碼產生的輸出的一個例子(在附圖中顯示)。代碼和圖像是按原樣放置的,沒有任何變化,所以將一個和另一個關聯起來應該相對容易,並確保它能夠正常工作(當然,可能會出現我忽略的錯誤)。相鄰小區信息不準確
的問題是相鄰小區的列表並常常包含有「不正確」的元素(我的理解)的數據,如:
- 一個
NeighboringCellInfo
所有特性 -lac
,cid
,psc
- 集到-1,只有rssi
字段看起來有意義; - a
NeighboringCellInfo
與lac
等於0;這是否意味着lac
與當前活動單元格相同? - a
NeighboringCellInfo
rssi
值超出範圍[0,31]而不是UNKNOWN_RSSI
;這些值可以是正值(33,如屏幕截圖所示),爲負值(它們看起來像一個適當的原始rssi值,不需要從asu
轉換); - 在同一地理定位中獲得的列表元素沒有像我期望的那樣表現出一致性,即在兩次連續掃描中,每個人都可以在另一個元素中省略元素,而省略元素的rssi級別不是列表中最低級別(實際上它們的rssi可以大於當前使用的單元);我承認這可能是正確的行爲,如果每個單元信號往往是不穩定的,但我不確定一般GSM和/或UMTS網絡是否是真的。當前電池總是有所有的字段定義好,但其rssi可以在30 dBm的範圍內快速變化(比如從-60到-90)。
- 與4相同,但從一天到另一天的一致性。在高度城市化和成熟的環境中,我希望每天都能看到相同的細胞列表,但它們各不相同,有一天,我甚至都沒有看到關於活細胞在提前天。
這是否意味着移動技術的正常運行,某種可能的節能優化或特定設備中的缺陷(在我的情況中爲LG Optimus One)?
請建議如何從Android的細胞環境獲得一致的讀數,如果可能的話。
GsmCellLocation cellLocation = (GsmCellLocation)telephonyManager.getCellLocation();
String networkOperator = telephonyManager.getNetworkOperator();
int type = telephonyManager.getNetworkType();
String mcc = networkOperator.substring(0, 3);
String mnc = networkOperator.substring(3);
textMCC.setText("mcc: " + mcc + " mnc: " + mnc);
textMNC.setText("operator: " + networkOperator);
int cid = cellLocation.getCid();
int lac = cellLocation.getLac();
int psc = cellLocation.getPsc();
textGsmCellLocation.setText(cellLocation.toString());
textCID.setText("lac: " + String.valueOf(lac) + " cid: " + String.valueOf(cid) + " psc: " + String.valueOf(psc) + " type: " + String.valueOf(type) + " rssi: " + String.valueOf(currentCellRSSI));
TextView Neighboring = (TextView)findViewById(R.id.neighboring);
List<NeighboringCellInfo> NeighboringList = telephonyManager.getNeighboringCellInfo();
String stringNeighboring = "Neighboring List - Lac : Cid : Psc : type : RSSI\n";
for(int i = 0; i < NeighboringList.size(); i++)
{
String dBm;
int rssi = NeighboringList.get(i).getRssi();
if(rssi == NeighboringCellInfo.UNKNOWN_RSSI)
{
dBm = "Unknown RSSI";
}
else
{
if(rssi >= 0 && rssi < 32)
{
dBm = String.valueOf(-113 + 2 * rssi) + " dBm";
}
else
{
dBm = "Unknown value:" + Integer.toString(rssi);
}
}
stringNeighboring = stringNeighboring
+ String.valueOf(NeighboringList.get(i).getLac()) + " : "
+ String.valueOf(NeighboringList.get(i).getCid()) + " : "
+ String.valueOf(NeighboringList.get(i).getPsc()) + " : "
+ String.valueOf(NeighboringList.get(i).getNetworkType()) + " : "
+ dBm + "\n";
}
Neighboring.setText(stringNeighboring);
我是正確的,你的答案基本上意味着,關於相鄰小區的信息只是在Android中不可靠,不能用於跨設備的穩定位置檢測? – Stan
不一定。問題在於一些設備報告的數據非常少(不超過服務小區),而其他設備則報告更多。正如我們所看到的,一些報告在相鄰小區中的虛假數據。如果您想使用相鄰單元進行位置檢測,則需要一些邏輯來處理相鄰單元數據:不要指望它可用,識別不完整的記錄並猜測丟失的信息或丟棄不能記錄的記錄可靠地完成。 – user149408