Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов
Я работаю над небольшим приложением, чтобы проверить уровень сигнала различных сетевых операторов в моей области. Мой текущий сигнал операторов довольно нестабилен, и я хочу заглянуть в силу других GSM-операторов.
Sofar Я использовал TelephonyManager и PhoneStateListener с вызовом onSignalStrengthsChanged, чтобы получить силу сигнала GSM для текущего оператора сети, но кажется, что этот класс дает мне информацию о силе сигнала сети, подключенной к моя SIM-карта.
Меня интересует измерение мощности сигнала GSM всех доступных операторов. Поиск в сети дал неопределенные намеки на использование внутренних классов Android, но я пока не нашел хороших примеров.
Любой ответ, который может меня переместить, чтобы получить список всех доступных сетевых операторов, и их уровень сигнала будут устранены.
Ответы
Ответ 1
Возможно, эти цитаты и ссылки помогут вам составить собственное решение:
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);
}
}
}
Надеюсь, это поможет. Я думаю, что это интересная задача, поэтому, возможно, я попробую в следующий раз, когда у меня будет свободное время. Удачи!
Ответ 2
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);
}
};
Ответ 3
Поскольку у меня нет 50 репутационных очков, вот результат моих поисков по теме:
Решение Алехандро Колорадо кажется хорошим. Но проблема в том, что классы, используемые для ее достижения, зарезервированы для системных приложений Android, то есть приложений, которые подписаны с тем же сигнатурным ключом, что и система.
Как это возможно? Я нашел два способа добиться этого.
Первый заключается в том, чтобы спросить работу у любого производителя compagny и подписать их NDA, но это не очень хорошее решение. Тем более, что приложение, реализованное и подписанное с помощью этого ключа, будет работать только на устройствах из compagny...
Второй, гораздо приятнее, но я предупреждаю вас, что вам будет легко, это сделать свой собственный ПЗУ. Вам нужно будет создать свое приложение, вставить его в каталог /system/app/ROM вашего ПЗУ и перекомпилировать его, чтобы запустить ваше устройство с новой системой. Но вопрос, на который я еще не ответил, - проблема непризнанной подписи ПЗУ.
Я думаю, что лучший способ избежать этой проблемы - добавить свой ключ подписи ROM в Recovery, который вы будете использовать.
Что, где я нахожусь в этом пункте, возможно, вы могли бы найти эти исследования полезными, я надеюсь на это!
Я вернусь позже, если найду дополнительную информацию для вас, ребята. Bye.
Ответ 4
создать PhoneStateListener и обработать обратный вызов onSignalStrengthChanged. Когда ваше приложение будет инициализировано, оно должно дать вам начальное уведомление. Это в 1.x. в 2.x есть issue об этом.