В настоящее время я трилатерирую свой Android с ячейками в своей сети. Это даже точнее, чем я думал. Но не так точно, как хотелось бы. Поэтому я хочу задействовать больше башен, чем получаю от getNeighboringCellInfo. Я хочу получить идентификатор соты и уровень сигнала каждой вышки в радиусе действия. каждого сетевого оператора. Есть ли способ "пинговать" вышки, чтобы они отвечали сотовым ID, Lac и сигналом? Каким-то образом это должно быть возможно. И можно ли сканировать 2G и 3G (и 4G) параллельно? Или можно переключаться между ними программно? Какие-либо предложения? Надеюсь, я достаточно ясно выразился...
Получение CID, LAC и уровня сигнала всех вышек сотовой связи в радиусе действия
Ответы (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 >= 28, в противном случае используйтеcellInfoWcdma.getCellIdentity().getMcc()
. Обратите внимание, что вы не можете получить MCC и MNC для CDMA.
Вы можете создать свой собственный класс модели и сохранить все необходимые значения, создав их объекты (где я прокомментировал). Сохраните эти объекты в списке. Не забудьте добавить разрешения в манифест.