提问人:Niko Gamulin 提问时间:7/30/2009 更新时间:2/16/2015 访问量:29982
Android:如何监控WiFi信号强度
Android: How to monitor WiFi signal strength
问:
当信号强度发生变化时,我会收到通知。我尝试创建以下方法并在 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));
}
如果有人能检查该方法是否正确编写,我将不胜感激。我尝试运行该应用程序,但没有收到任何通知,不确定是因为信号强度在我运行调试的地方可能是恒定的,还是因为缺少某些东西。
谢谢!
答:
12赞
lilbyrdie
7/31/2009
#1
首先,请确保清单中有 for。<uses-permission>
ACCESS_WIFI_STATE
其次,我不确定单个连接的通知,但要获取收音机看到的所有内容的通知,您可以开始扫描:
wifi.startScan();
接下来,当我收到成功的结果时,我在 .WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
IntentFilter
然后,在接收器中,我使用来自对象,其中也包含信号强度。getScanResults()
WifiManager
要以这种方式停止它,您只需调用(因此您需要保留它以供参考)。我还没有测试自己,看看我的扫描码是否可以修改为只检查当前连接,但我知道我得到了很多结果——Wi-Fi 信号变化频繁且快速。我想要监视单个连接,您也可以过滤扫描结果并查找设备当前连接到的连接。unregisterRecever()
我希望这能有所帮助。
评论
3赞
Vervatovskis
4/17/2012
你能稍微提出一下你的答案吗?
0赞
sschrass
2/16/2015
#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 秒仅每 5 秒一次。startScan()
评论