Android:如何监控 WiFi 信号强度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1206891/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: How to monitor WiFi signal strength
提问by Niko Gamulin
I would receive notifications when signal strength changes. I tried to create the following method and call it in the onCreate():
当信号强度发生变化时,我会收到通知。我尝试创建以下方法并在 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));
}
I would appreciate if anyone could check if the method is written correctly. I tried to run the app, but haven't received any notifications and am not sure whether it is because the signal strength might be constant in the place I run debug or it is because something is missing.
如果有人可以检查该方法是否正确编写,我将不胜感激。我尝试运行该应用程序,但没有收到任何通知,我不确定这是因为我运行调试的地方信号强度可能是恒定的,还是因为缺少某些东西。
Thanks!
谢谢!
采纳答案by lilbyrdie
First, make sure you have <uses-permission>
for ACCESS_WIFI_STATE
in your manifest.
首先,确保您的清单中有<uses-permission>
for ACCESS_WIFI_STATE
。
Second, I'm not sure about notifications for a single connection, but to get notifications of everything the radio is seeing, you can start a scan:
其次,我不确定单个连接的通知,但要获取收音机看到的所有内容的通知,您可以开始扫描:
wifi.startScan();
Next, when I've received successful results, I used WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
in the IntentFilter
.
接下来,当我收到成功的结果时,我WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
在IntentFilter
.
Then, in the receiver, I use getScanResults()
from the WifiManager
object, which also contains the signal strength.
然后,在接收器中,我使用getScanResults()
fromWifiManager
对象,其中还包含信号强度。
For stopping it this way, you simply call to unregisterRecever()
(so you'll want to keep it around for referencing). I haven't tested myself to see if my scanning code can be modified to just check the current connection, but I do know I got plenty of results -- Wi-Fi signals change frequently and quickly. I suppose for monitoring a single connection, you can also just filter the scan results and look for the one the device is currently connected to.
要以这种方式停止它,您只需调用unregisterRecever()
(因此您需要保留它以供参考)。我还没有测试过自己是否可以修改我的扫描代码以仅检查当前连接,但我知道我得到了很多结果——Wi-Fi 信号频繁且快速地变化。我想为了监视单个连接,您还可以过滤扫描结果并查找设备当前连接到的那个。
I hope this helps a little.
希望这会有帮助。
回答by sschrass
Just to drop my solution:
只是为了放弃我的解决方案:
in my App I have
在我的应用程序中,我有
@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);
}
And the onReceive in my Receiver looks like:
我的接收器中的 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);
}
The idea is the to startScan()
only every 5 seconds if the wifi is the active network.
startScan()
如果 wifi 是活动网络,这个想法是每 5 秒一次。