Android: получить CellID и RSS для базовой станции и соседних ячеек

Я пытаюсь получить следующие данные:

  • базовая станция: CellID и RSS (распознавание, которое является базовой станцией)
  • для всех соседних станций: CellID и RSS

существуют различные API, и похоже, мне придется использовать разные API telephonyManager и PhoneStateListener. Я немного запутался, так как думаю, что это должно быть доступно в одном интерфейсе. Также я думаю, что должно быть возможно опросить CellID текущая базовая станция вместо прослушивания изменений состояния для определения int, так как соседние сотовые станции cal также опрашиваются из telephonyManager.

вы можете сказать мне, как я могу получить данные, указанные выше?

1 ответов


новый skool-way: API 17 намного лучше и чище, но все же слишком новый.

List<CellInfo> cellInfos = (List<CellInfo>) this.telephonyManager.getAllCellInfo();

for(CellInfo cellInfo : cellInfos)
{
    CellInfoGsm cellInfoGsm = (CellInfoGsm) cellInfo;

    CellIdentityGsm cellIdentity = cellInfoGsm.getCellIdentity();
    CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength();

    Log.d("cell", "registered: "+cellInfoGsm.isRegistered());
    Log.d("cell", cellIdentity.toString());         
    Log.d("cell", cellSignalStrengthGsm.toString());
}

старый API не обеспечивает очень удовлетворительное решение. Но вот старый-школьный способ:

this.telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
this.phoneStateListener = setupPhoneStateListener();
this.telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION);
this.telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
this.telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);

// This part is used to listen for properties of the neighboring cells
List<NeighboringCellInfo> neighboringCellInfos = this.telephonyManager.getNeighboringCellInfo();
for(NeighboringCellInfo neighboringCellInfo : neighboringCellInfos)
{
    neighboringCellInfo.getCid();
    neighboringCellInfo.getLac();
    neighboringCellInfo.getPsc();
    neighboringCellInfo.getNetworkType();
    neighboringCellInfo.getRssi();

    Log.d("cellp",neighboringCellInfo.toString());
}

public PhoneStateListener setupPhoneStateListener()
{
    return new PhoneStateListener() {

        /** Callback invoked when device cell location changes. */
        @SuppressLint("NewApi")
        public void onCellLocationChanged(CellLocation location)
        {
            GsmCellLocation gsmCellLocation = (GsmCellLocation) location;
            gsmCellLocation.getCid();
            gsmCellLocation.getLac();
            gsmCellLocation.getPsc();

            Log.d("cellp", "registered: "+gsmCellLocation.toString());
        }

        /** invoked when data connection state changes (only way to get the network type) */
        public void onDataConnectionStateChanged(int state, int networkType)
        {
            Log.d("cellp", "registered: "+networkType);
        }

        /** Callback invoked when network signal strengths changes. */
        public void onSignalStrengthsChanged(SignalStrength signalStrength)
        {
            Log.d("cellp", "registered: "+signalStrength.getGsmSignalStrength());
        }

    };
}
  • Не забудьте установить все необходимые разрешения Проблема с этим решением заключается в том, что я не получаю никакой информации о соседней ячейке, хотя я настраиваю:

    использует-разрешение android: name= " android.разрешение.ACCESS_COARSE_UPDATES"

(обратите внимание, что я использую телефон Samsung и это известная проблема, что телефоны Samsung не поддерживают списка соседних ячеек)