应用程序永远不会收到RSSI_CHANGED_ACTION

时间:2012-01-03 19:43:54

标签: android wifi signals rssi

我是Android编程的新手,我正在尝试理解BroadcastReceivers的概念。为了帮助自己,我只是想写一个监视Wifi信号强度的小应用程序。

现在,根据我的理解,我可以等待接收系统广播的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: How to monitor WiFi signal strength,它似乎没有帮助我。我也在这里尝试了代码示例http://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.html,它也从未更新过RSSI值。我很困惑为什么会这样。你能给我的任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:7)

所以,我遇到了同样的问题,想要在用户走动时更新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

答案 1 :(得分:0)

当RSSI级别发生变化时,会触发WifiManager.RSSI_CHANGED_ACTION。 I.E.你输了或赢了一个wifi吧。它不会经常发生。 我的猜测是它很粘,所以它会在注册时触发。

如上所述,我找到解决问题的最佳方法是通过WifiManager.SCAN_RESULTS_AVAILABLE_ACTION。