Android:如何监控WiFi信号强度
问题描述:
我会在信号强度发生变化时收到通知。我试图创建下面的方法,并调用它在OnCreate():Android:如何监控WiFi信号强度
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));
}
我希望如果如果方法正确写入任何人都可以查询。我试图运行应用程序,但没有收到任何通知,也不确定它是否是因为信号强度可能在我运行调试的地方不变,或者是因为缺少某些东西。
谢谢!
答
首先,请确保您的清单文件中有<uses-permission>
,ACCESS_WIFI_STATE
。当我收到成功
wifi.startScan();
下,:
其次,我不知道有关通知对于单个的连接,但得到的一切无线电是看到通知,你就可以开始扫描结果,我在IntentFilter
中使用WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
。
然后,在接收器中,我使用WifiManager
对象中的getScanResults()
,它还包含信号强度。
对于以这种方式停止,您只需致电unregisterRecever()
(因此您需要保留它以便引用)。我还没有测试自己,看看我的扫描代码是否可以修改为只检查当前连接,但我知道我得到了很多结果 - Wi-Fi信号频繁且快速地变化。我想为了监控一个连接,你也可以过滤扫描结果并寻找设备当前连接的那个。
我希望这会有所帮助。
答
就砸我的解决方案:
在我的应用我有
@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);
}
而且的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);
}
的想法是,以startScan()
只有每如果wifi是活动网络,则为5秒。
你可以开发你的答案咯? – Vervatovskis 2012-04-17 11:07:25