Приложение никогда не получает измененное действие 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 6

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 (), потому что это не будет вызвано, если пользователь перемещается назад в стек истории.

Попробуйте зарегистрировать приемник внутри вашего андроидного Манифеста.