Приложение никогда не получает измененное действие RSSI
Я новичок в программировании на Android и пытаюсь понять концепцию BroadcastReceivers. Чтобы помочь себе,я просто пытаюсь написать небольшое приложение, которое контролирует уровень сигнала Wi-Fi.
Теперь, исходя из моего понимания, я могу просто ждать получения RSSI_CHANGED_ACTION, транслируемого системой. RSSI должен часто меняться, что означает, что я должен получать это уведомление часто...однако я никогда не получаю его один раз. Я разбавил свой код водой. до самого минимума, так что он просто регистрирует сообщение, когда уведомление получено.
public class RssiActivity extends Activity {
public BroadcastReceiver rssiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("Rssi", "RSSI changed");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void onResume() {
super.onResume();
registerReceiver(rssiReceiver, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
Log.d("Rssi", "Registered");
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(rssiReceiver);
Log.d("Rssi", "Unregistered");
}
}
Я уже видел этот пост Android: Как контролировать уровень сигнала WiFi, и это, кажется, не помогает мне. Я также попробовал пример кода здесь http://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.html и он также никогда не обновлял значение RSSI. Я совершенно не понимаю, почему это так. Любая помощь, которую вы можете мне оказать, будет очень признательна. Спасибо!
3 ответа:
Итак, у меня была та же проблема, что и у вас, желая обновить значение RSSI, когда пользователь ходил вокруг, и т. д., И я не мог решить ее с помощью RSSI_CHANGED_ACTION.
Как и проблема, с которой вы столкнулись, мой обратный вызов не будет вызван правильно. Как ни странно, он был вызван только один раз, когда была создана деятельность, и больше никогда.
Мой Обходной Путь
В onCreate () зарегистрируйте обратный вызов для SCAN_RESULTS_AVAILABLE_ACTION. Тогда называть WiFiManager, с помощью которого.startScan().
Теперь, в вашем обратном вызове, сделайте:
WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE); int newRssi = wifiMan.getConnectionInfo().getRssi(); wifiMan.startScan();
Теперь у вас есть цикл, в котором обратный вызов инициирует сканирование, получает результаты и инициирует другое сканирование.
Это грубо и высосет много энергии, однако, вы можете наблюдать, как значения RSSI меняются, когда вы ходите вокруг.
Полный Код
(Обратите внимание, что я использую onResume и onPause для регистрации и отмены регистрации, поэтому он будет сканировать только повторно, например, отработанный аккумулятор, когда активность на экране)
@Override public void onResume() { super.onResume(); //Note: Not using RSSI_CHANGED_ACTION because it never calls me back. IntentFilter rssiFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); this.registerReceiver(myRssiChangeReceiver, rssiFilter); WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE); wifiMan.startScan(); } @Override public void onPause() { super.onPause(); this.unregisterReceiver(myRssiChangeReceiver); } /** * Broadcast receiver to update */ private BroadcastReceiver myRssiChangeReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context arg0, Intent arg1) { WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE); wifiMan.startScan(); int newRssi = wifiMan.getConnectionInfo().getRssi(); Toast.makeText(getActivity(), ""+newRssi, Toast.LENGTH_SHORT).show(); }};
Извините, что так поздно, я просто должен был узнать, что я должен был решить вашу проблему: P
WifiManager.RSSI_CHANGED_ACTION срабатывает, когда уровень сигнала меняется. То есть вы проигрываете или выигрываете wifi-бар. Такое случается не так уж часто. Я думаю, что он липкий, поэтому он срабатывает при регистрации.
Как уже было сказано, лучший способ, который я нашел для решения этой проблемы, - это WiFiManager.SCAN_RESULTS_AVAILABLE_ACTION .
Вы уверены, что он должен сработать (то есть вы уверены, что сила сигнала меняется)? вы читали документациюBroadcastReciever ?
Примечание: при регистрации получателя в вашей деятельности.onResume() реализации, вы должны отменить регистрацию его в действие.onPause (). (Вы не будете получать намерения, когда приостановлены, и это сократит ненужные системные издержки). Не следует отключать активности.onSaveInstanceState (), потому что это не будет вызвано, если пользователь перемещается назад в стек истории.
Попробуйте зарегистрировать приемник внутри вашего андроидного Манифеста.