【问题标题】:Android: How to monitor WiFi signal strengthAndroid:如何监控 WiFi 信号强度
【发布时间】:2009-07-30 14:18:38
【问题描述】:

我会在信号强度发生变化时收到通知。我尝试创建以下方法并在 onCreate() 中调用它:

private void initializeWiFiListener(){
    Log.i(TAG, "executing initializeWiFiListener");

    String connectivity_context = Context.WIFI_SERVICE;
    final WifiManager wifi = (WifiManager)getSystemService(connectivity_context);

    if(!wifi.isWifiEnabled()){
        if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){
            wifi.setWifiEnabled(true);
        }
    }

    registerReceiver(new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            WifiInfo info = wifi.getConnectionInfo();
            //TODO: implement methods for action handling
        }

    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
}

如果有人可以检查该方法是否正确编写,我将不胜感激。我尝试运行该应用程序,但没有收到任何通知,并且不确定是因为在我运行调试的地方信号强度可能是恒定的,还是因为缺少某些东西。

谢谢!

【问题讨论】:

    标签: android networking


    【解决方案1】:

    首先,确保您的清单中有 <uses-permission>ACCESS_WIFI_STATE

    其次,我不确定单个连接的通知,但要获取收音机看到的所有内容的通知,您可以开始扫描:

    wifi.startScan();
    

    接下来,当我收到成功的结果时,我在IntentFilter 中使用了WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

    然后,在接收器中,我使用来自WifiManager 对象的getScanResults(),其中还包含信号强度。

    要以这种方式停止它,您只需致电unregisterRecever()(因此您需要保留它以供参考)。我还没有测试自己是否可以修改我的扫描代码以仅检查当前连接,但我确实知道我得到了很多结果——Wi-Fi 信号变化频繁且迅速。我想对于监控单个连接,您也可以过滤扫描结果并查找设备当前连接的那个。

    我希望这会有所帮助。

    【讨论】:

    • 你能稍微完善一下你的答案吗?
    【解决方案2】:

    只是为了放弃我的解决方案:

    在我的应用中

    @Override
    protected void onResume() {
        super.onResume();
        networkStateReceiver = new NetworkStateReceiver(this);
        this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
        this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS"));
        networkStateReceiver.registerListener(this);
    }
    

    我的 Receiver 中的 onReceive 看起来像:

    @Override
    public void onReceive(Context context, Intent intent) {
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
            switch (networkInfo.getType()) {
                case ConnectivityManager.TYPE_ETHERNET:
                    this.networkStateMessage = new NetworkStateMessage(networkInfo);
                    break;
                case ConnectivityManager.TYPE_WIFI:
                    this.networkStateMessage = new NetworkStateMessage(networkInfo, wifiManager.getConnectionInfo());
                    worker.schedule(new Runnable() {
                        @Override
                        public void run() { wifiManager.startScan(); }
                    }, 5, TimeUnit.SECONDS);
                    break;
                default:
                    this.networkStateMessage = null;
                    break;
            }
        }
        notifyStateToAll(this.networkStateMessage);
    }
    

    如果 wifi 是活动网络,这个想法是每 5 秒发送一次 startScan()

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多