Mr Asker
Mr Asker

Reputation: 2380

Android: detect whether wifi access point still in range

I have a method to detect available wifi access ppoints. My method works well but when I am not in the range I still getiing the SSID of the last scan results displayed in my xml file though I am out of the range of this SSID.

	private void check_wifi_available() {
		WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

		if (!wifi.isWifiEnabled()) {
			Toast.makeText(this, "Please turn your Wi-Fi on",
					Toast.LENGTH_SHORT).show();

		}
		
		
		

		WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		final List<ScanResult> results = wifiManager.getScanResults();
		if (results != null) {
			// list of access points from the last scan
			List<ScanResult> updatedResults = new ArrayList<ScanResult>();
			// pick Wi-Fi access points which begins with these "SV-"
			// characters.
			for (int i = 0; i < results.size(); i++) {
				String ssid = results.get(i).SSID;
				// Pattern p = Pattern.compile("^KD-(4[0-9]{2}|500)$");
				// Matcher m = p.matcher(ssid);
				// if(m.matches()){}else{}
				if (ssid.startsWith("KD")) {

					updatedResults.add(results.get(i));
				}
			}
			if (updatedResults.size() > 0) {
				String a = deliverBestAccessPoint(updatedResults);
				textWifi.setText(a.toString());
			}
		}
	}

Upvotes: 0

Views: 542

Answers (1)

Jack Straw
Jack Straw

Reputation: 586

This is best handled by the operating system. The best you could do is set up a timer to periodically scan for WiFi devices and update the results.

Other than that, on rooted devices you may be able to manually send 802.11 requests to the access point/router and do a timeout check for replies.

To clarify: the operating system, when it is scanning for devices, sends out a broadcast message and reports what devices it hears back from. When devices are toward the edge of the 'range' they may report as being available even if connecting and maintaining a connection is problematic because the signal is not strong enough.

EDIT:

For what it's worth, ScanResult has a "level" member variable that reports the signal strength. You could do some more fine filtering for low-strength results. http://developer.android.com/reference/android/net/wifi/ScanResult.html

Upvotes: 1

Related Questions