Как получить уровень сигнала сотовой связи в Android?
Я пытаюсь написать очень простое приложение для Android, которое проверяет уровень сигнала текущей ячейки. Пока я нашел только то, что называется getNeighboringCellInfo()
, но я не совсем уверен, включает ли это текущую ячейку.
Как я могу получить силу сигнала CURRENT ячейки в Android?
Есть ли getNeighborCellInfo()
получить текущую ячейку? Это не похоже на результаты, которые я смог получить. Вот мой текущий код:
List<NeighboringCellInfo> n = tm.getNeighboringCellInfo();
//Construct the string
String s = "";
int rss = 0;
int cid = 0;
for (NeighboringCellInfo nci : n)
{
cid = nci.getCid();
rss = -113 + 2*nci.getRssi();
s += "Cell ID: " + Integer.toString(cid) + " Signal Power (dBm): " +
Integer.toString(rss) + "\n";
}
mainText.setText(s);
3 ответа
Создайте PhoneStateListener и обрабатывайте обратный вызов onSignalStrengthChanged. Когда ваше приложение инициализируется, оно должно дать вам начальное уведомление. Это в 1.х. в 2.x есть открытая проблема по этому поводу.
Этот код может помочь:
PhoneStateListener phoneStateListener = new PhoneStateListener() {
public void onCallForwardingIndicatorChanged(boolean cfi) {}
public void onCallStateChanged(int state, String incomingNumber) {}
public void onCellLocationChanged(CellLocation location) {}
public void onDataActivity(int direction) {}
public void onDataConnectionStateChanged(int state) {}
public void onMessageWaitingIndicatorChanged(boolean mwi) {}
public void onServiceStateChanged(ServiceState serviceState) {}
public void onSignalStrengthChanged(int asu) {}
};
Создав свой собственный прослушиватель состояния телефона, зарегистрируйте его в диспетчере телефонии, используя битовую маску, чтобы указать события, которые вы хотите прослушивать, как показано в следующем фрагменте кода:
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
PhoneStateListener.LISTEN_CALL_STATE |
PhoneStateListener.LISTEN_CELL_LOCATION |
PhoneStateListener.LISTEN_DATA_ACTIVITY |
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR |
PhoneStateListener.LISTEN_SERVICE_STATE |
PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
Кроме того, необходимо добавить их в AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Код ниже создаст эффект, подобный картинке (информация о ячейке системы Android)
Внутри вашей текущей активности/фрагмента создайте такой подкласс
TextView txtSignalMobile1 = findViewById...;
class myPhoneStateListener extends PhoneStateListener {
public int signalStrengthValue;
public int signalLevel;
@RequiresApi(api = Build.VERSION_CODES.Q)
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
if (signalStrength.isGsm()) {
if (signalStrength.getGsmSignalStrength() != 99)
signalStrengthValue = signalStrength.getGsmSignalStrength() * 2 - 113;
else{
signalStrengthValue = signalStrength.getCellSignalStrengths().get(0).getDbm();
signalLevel =signalStrength.getCellSignalStrengths().get(0).getAsuLevel();
}
} else {
signalStrengthValue = signalStrength.getCdmaDbm();
}
txtSignalMobile1.setText(signalStrengthValue + "dbm, " + signalLevel + "asu");
}
}
Вызовите где-нибудь еще, возможно, onCreate или после кнопки... (используемый поток для постоянного обновления значения изменен)
Thread splashThread2 = new Thread() {
@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// update TextView here!
int signal2 = NetworkUtils.GetWifiSignal(requireContext());
txtSignalWifi.setText(signal2 + "/100");
}
});
}
} catch (Exception ignore) {
// when user exit suddenly
}
}
};
splashThread2.start();