利用可能な各Wifiアクセスポイントの信号強度を読み取るアプリケーションを構築しています。
私は次のようなコードを書きました:
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
// Get WiFi status
WifiInfo info = wifi.getConnectionInfo();
textStatus.append("\n\nWiFi Status: " + info.toString());
// List available networks
List<WifiConfiguration> configs = wifi.getConfiguredNetworks();
ただし、2つの問題があります。
デバッグでは、configs
には1つの接続しか含まれていません。ただし、システムのWi-Fi設定で使用可能なAPがいくつかあることがわかります。つまりconfigs
は不完全なリストです。
WifiConfiguration
で信号強度を取得する方法がわかりません。
ところで、私はHTCHeroとAndroid 1.5を使用しています。
Android APIドキュメント WifiManager.getConfiguredNetworks() によると、信号強度パラメーターは入力されません。このデータは、記憶されているアクセスポイントの設定のみを表し、表示されているものは表しません。
実際に表示されるネットワークを取得するには、 WifiManager.startScan() を呼び出してWiFi無線スキャンを開始し、しばらくして WifiManager.getScanResults() を呼び出してスキャン結果を取得する必要があります。
以下のコードは、wifiのバーを取得するのに役立ちます:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
int state = wifi.getWifiState();
if(state == WifiManager.WIFI_STATE_ENABLED) {
List<ScanResult> results = wifi.getScanResults();
for (ScanResult result : results) {
if(result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) {
int level = WifiManager.calculateSignalLevel(wifi.getConnectionInfo().getRssi(),
result.level);
int difference = level * 100 / result.level;
int signalStrangth= 0;
if(difference >= 100)
signalStrangth = 4;
else if(difference >= 75)
signalStrangth = 3;
else if(difference >= 50)
signalStrangth = 2;
else if(difference >= 25)
signalStrangth = 1;
tv.setText(tv.getText() + "\nDifference :" + difference + " signal state:" + signalStrangth);
}
}
}
}
}, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
receiverWifi = new WifiReceiver();
registerReceiver(receiverWifi, new IntentFilter(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
class WifiReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiList = mainWifi.getScanResults();
ArrayList<WifiConnectionBean> m4MessagesList = new ArrayList<WifiConnectionBean>();
for (int i = 0; i < wifiList.size(); i++) {
ScanResult scanResult = wifiList.get(i);
WifiConnectionBean bean = new WifiConnectionBean();
bean.setConnectionName(scanResult.SSID); // + "--" +
// scanResult.frequency);
bean.setDescription(scanResult.capabilities);
bean.setId(scanResult.SSID);
bean.setLevel(String.valueOf(scanResult.level));
bean.setSignalStrength(String.valueOf(scanResult.BSSID));
m4MessagesList.add(bean);
}
if (m4MessagesList == null) {
Toast.makeText(WifiIdentificationActivity.this,
"WifiConnection not available", Toast.LENGTH_SHORT)
.show();
} else {
String message = "Scanning complete. " + m4MessagesList.size()
+ " connections found!";
}
pd.dismiss();
}
}
ここで、scanResult.SSIDは信号強度を示します。
private void checkNetworkStrengh() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo Info = cm.getActiveNetworkInfo();
if (Info == null || !Info.isConnectedOrConnecting()) {
Log.i(TAG, "No connection");
} else {
int netType = Info.getType();
int netSubtype = Info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI) {
Log.i(TAG, "Wifi connection");
WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE);
List<ScanResult> scanResult = wifiManager.getScanResults();
for (int i = 0; i < scanResult.size(); i++) {
Log.d("scanResult", "Speed of wifi"+scanResult.get(i).level);//The db level of signal
}
// Need to get wifi strength
} else if (netType == ConnectivityManager.TYPE_MOBILE) {
Log.i(TAG, "GPRS/3G connection");
// Need to get differentiate between 3G/GPRS
}
}
}
WifiManager wifiManager = (WifiManager)
MonitorActivity.this.getSystemService(Context.WIFI_SERVICE);
wifiManager.addNetwork(conf);
int numberOfLevels = 5;
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);
Log.e("level", "" + level);
// you will get the levels. Using these levels you can calculate strenghts.