Приложение никогда не получает RSSI_CHANGED_ACTION - PullRequest
6 голосов
/ 03 января 2012

Я новичок в программировании 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-Monitoring-of.html , и он также никогда не обновлял значение RSSI.Я совершенно не понимаю, почему это так.Буду очень признателен за любую помощьСпасибо!

Ответы [ 3 ]

7 голосов
/ 11 июля 2012

Итак, у меня возникла та же проблема, что и у вас, когда я захотел обновить значение 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

0 голосов
/ 12 февраля 2015

WifiManager.RSSI_CHANGED_ACTION срабатывает при изменении уровней RSSI.То есть вы проигрываете или выигрываете вай-бар.Так бывает не часто.Я предполагаю, что он липкий, поэтому он срабатывает при регистрации.

Как уже было сказано, лучший способ решить эту проблему - через WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.

0 голосов
/ 04 января 2012

вы уверены, что он должен сработать (имеется в виду, что вы уверены, что уровень сигнала меняется)?Вы прочитали BroadcastReciever Документирование?

Примечание. Если вы регистрируете получателя в реализации Activity.onResume (), вы должны отменить его регистрацию в Activity.onPause ().(Вы не будете получать намерения, когда приостановлены, и это уменьшит ненужные системные издержки).Не отменяйте регистрацию в Activity.onSaveInstanceState (), потому что это не будет вызвано, если пользователь вернется в стек истории.

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

...