Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов

Я работаю над небольшим приложением, чтобы проверить уровень сигнала различных сетевых операторов в моей области. Мой текущий сигнал операторов довольно нестабилен, и я хочу заглянуть в силу других GSM-операторов.

Sofar Я использовал TelephonyManager и PhoneStateListener с вызовом onSignalStrengthsChanged, чтобы получить силу сигнала GSM для текущего сетевого оператора, но, похоже, этот класс дает мне информацию о мощности сигнала в сети, подключенной к моей SIM-карте ,

Меня интересует измерение мощности сигнала GSM всех доступных операторов. Поиск в сети дал неопределенные намеки на использование внутренних классов Android, но я пока не нашел хороших примеров.

Любой ответ, который может меня переместить, чтобы получить список всех доступных сетевых операторов и их силу сигнала, можно получить.

Solutions Collecting From Web of "Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов"

Возможно, эти цитаты и ссылки помогут вам составить собственное решение:

1.- Получить список доступных сетевых провайдеров (процитировать Как получить список доступных сетевых провайдеров в полном объеме):

Поскольку Android является открытым исходным кодом, я просмотрел источники и, наконец, нашел что-то, называемое INetworkQueryService . Я думаю, вы можете сделать то же самое, что и настройки настроек Android и взаимодействовать с этой службой. Некоторые рекомендации через NetworkSettings.java:

  • OnCreate запускает NetworkQueryService и связывает его.
  • LoadNetworksList () сообщает службе запрос для сетевых операторов.
  • INetworkQueryServiceCallback оценивается, и если событие «EVENT_NETWORK_SCAN_COMPLETED» было поднято, networkListLoaded будет вызываться для итерации по доступным сетям.

2. Даже быстрое ознакомление с интерфейсом NetworkSetting.java и INetworkQueryService дает нам представление о достижении вашей цели.

  • Подключить службу в декларации.
/** * Service connection code for the NetworkQueryService. * Handles the work of binding to a local object so that we can make * the appropriate service calls. */ /** Local service interface */ private INetworkQueryService mNetworkQueryService = null; /** Service connection */ private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() { /** Handle the task of binding the local object to the service */ public void onServiceConnected(ComponentName className, IBinder service) { if (DBG) log("connection created, binding local service."); mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService(); // as soon as it is bound, run a query. loadNetworksList(); } /** Handle the task of cleaning up the local binding */ public void onServiceDisconnected(ComponentName className) { if (DBG) log("connection disconnected, cleaning local binding."); mNetworkQueryService = null; } }; 
  • OnCreate запускает NetworkQueryService и связывает его.
 Intent intent = new Intent(this, NetworkQueryService.class); ... startService (intent); bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE); 
  • LoadNetworksList () сообщает службе запрос для сетевых операторов.
 private void loadNetworksList() { ... // delegate query request to the service. try { mNetworkQueryService.startNetworkQuery(mCallback); } catch (RemoteException e) { } displayEmptyNetworkList(false); } 
  • Оценивается INetworkQueryServiceCallback:
 /** * This implementation of INetworkQueryServiceCallback is used to receive * callback notifications from the network query service. */ private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() { /** place the message on the looper queue upon query completion. */ public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) { if (DBG) log("notifying message loop of query completion."); Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED, status, 0, networkInfoArray); msg.sendToTarget(); } }; 
  • Если событие «EVENT_NETWORK_SCAN_COMPLETED» было поднято, вызовы networkListLoaded будут вызываться для итерации по доступным сетям.
 private void networksListLoaded(List<OperatorInfo> result, int status) { ... if (status != NetworkQueryService.QUERY_OK) { ... displayNetworkQueryFailed(status); displayEmptyNetworkList(true); } else { if (result != null){ displayEmptyNetworkList(false); ... } else { displayEmptyNetworkList(true); } } } 

Я надеюсь, что это помогает. Я думаю, что это интересная задача, поэтому, возможно, я попробую в следующий раз, когда у меня будет свободное время. Удачи!

 private final PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallForwardingIndicatorChanged(boolean cfi) { super.onCallForwardingIndicatorChanged(cfi); } @Override public void onCallStateChanged(int state, String incomingNumber) { //checkInternetConnection(); String callState = "UNKNOWN"; switch (state) { case TelephonyManager.CALL_STATE_IDLE: callState = "IDLE"; break; case TelephonyManager.CALL_STATE_RINGING: callState = "Ringing (" + incomingNumber + ")"; break; case TelephonyManager.CALL_STATE_OFFHOOK: callState = "Offhook"; break; } Log.i("Phone Stats", "onCallStateChanged " + callState); super.onCallStateChanged(state, incomingNumber); } @Override public void onCellLocationChanged(CellLocation location) { String cellLocationString = location.toString(); super.onCellLocationChanged(location); } @Override public void onDataActivity(int direction) { String directionString = "none"; switch (direction) { case TelephonyManager.DATA_ACTIVITY_IN: directionString = "IN"; break; case TelephonyManager.DATA_ACTIVITY_OUT: directionString = "OUT"; break; case TelephonyManager.DATA_ACTIVITY_INOUT: directionString = "INOUT"; break; case TelephonyManager.DATA_ACTIVITY_NONE: directionString = "NONE"; break; default: directionString = "UNKNOWN: " + direction; break; } Log.i("Phone Stats", "onDataActivity " + directionString); super.onDataActivity(direction); } @Override public void onDataConnectionStateChanged(int state,int networktype) { String connectionState = "Unknown"; switch (state ) { case TelephonyManager.DATA_CONNECTED : connectionState = "Connected"; break; case TelephonyManager.DATA_CONNECTING: connectionState = "Connecting"; break; case TelephonyManager.DATA_DISCONNECTED: connectionState = "Disconnected"; break; case TelephonyManager.DATA_SUSPENDED: connectionState = "Suspended"; break; default: connectionState = "Unknown: " + state; break; } super.onDataConnectionStateChanged(state); Log.i("Phone Stats", "onDataConnectionStateChanged " + connectionState); } @Override public void onMessageWaitingIndicatorChanged(boolean mwi) { super.onMessageWaitingIndicatorChanged(mwi); } @Override public void onServiceStateChanged(ServiceState serviceState) { String serviceStateString = "UNKNOWN"; switch (serviceState.getState()) { case ServiceState.STATE_IN_SERVICE: serviceStateString = "IN SERVICE"; break; case ServiceState.STATE_EMERGENCY_ONLY: serviceStateString = "EMERGENCY ONLY"; break; case ServiceState.STATE_OUT_OF_SERVICE: serviceStateString = "OUT OF SERVICE"; break; case ServiceState.STATE_POWER_OFF: serviceStateString = "POWER OFF"; break; default: serviceStateString = "UNKNOWN"; break; } Log.i("Phone Stats", "onServiceStateChanged " + serviceStateString); super.onServiceStateChanged(serviceState); } @Override public void onSignalStrengthChanged(int asu) { Log.i("Phone Stats", "onSignalStrengthChanged " + asu); setSignalLevel( asu); super.onSignalStrengthChanged(asu); } private void setSignalLevel(int level) { int sLevel = (int) ((level / 31.0) * 100); Log.i("signalLevel ", "" + sLevel); } }; 

Поскольку у меня нет 50 репутационных очков, вот результат моих поисков по теме:

Решение Алехандро Колорадо кажется хорошим. Но проблема в том, что классы, используемые для ее достижения, зарезервированы для приложений системы Android, то есть приложений, которые подписаны с тем же сигнатурным ключом, что и система.

Как это возможно? Я нашел два способа добиться этого.

Первый заключается в том, чтобы спросить работу у любого производителя и подписать их NDA, но это не очень хорошее решение. Тем более, что приложение, реализованное и подписанное с помощью этого ключа, будет работать только на устройствах из compagny …

Второй, гораздо приятнее, но я предупреждаю вас, что это будет нелегко, это сделать свой собственный ПЗУ. Вам нужно будет создать свое приложение, вставить его в каталог / system / app / ROM вашего ПЗУ и перекомпилировать его, чтобы запустить ваше устройство с новой системой. Но есть вопрос, на который я еще не ответил, проблема с непризнанной подписью ПЗУ. Я думаю, что лучший способ избежать этой проблемы – добавить свой ключ подписи ROM в Recovery, который вы будете использовать.

Вот где я на данный момент, возможно, вы могли бы найти эти исследования полезными, я надеюсь! Я вернусь позже, если я найду для вас больше информации. До свидания.

Создать PhoneStateListener и обработать обратный вызов onSignalStrengthChanged. Когда ваше приложение будет инициализировано, оно должно дать вам начальное уведомление. Это в 1.x. В 2.x, есть открытый вопрос об этом.