我需要檢測何時可以與特定WIFI網絡建立網絡連接。Android WIFI如何在特定WIFI連接可用時進行檢測
例如:當你走進你的房子,並且你的手機拿起你的家庭WiFi網絡時,我想告訴你「你不在你的家庭網絡中,你想連接到你家?」但我希望只有當我在我的家中時纔會發生這種情況。
我應該聽什麼,應該做什麼測試以確保它是我的特定家庭網絡,而不是另一個網絡?
我需要檢測何時可以與特定WIFI網絡建立網絡連接。Android WIFI如何在特定WIFI連接可用時進行檢測
例如:當你走進你的房子,並且你的手機拿起你的家庭WiFi網絡時,我想告訴你「你不在你的家庭網絡中,你想連接到你家?」但我希望只有當我在我的家中時纔會發生這種情況。
我應該聽什麼,應該做什麼測試以確保它是我的特定家庭網絡,而不是另一個網絡?
您可以使用廣播接收器來找出WIFI網絡已經改變:
BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
context.registerReceiver(broadcastReceiver, intentFilter);
的BroadcastReceiver可能看起來像這樣。 要檢查特定的MAC地址,請參閱下面的checkConnectedToDesiredWifi()方法。
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) {
SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
if (SupplicantState.isValidState(state)
&& state == SupplicantState.COMPLETED) {
boolean connected = checkConnectedToDesiredWifi();
}
}
}
/** Detect you are connected to a specific network. */
private boolean checkConnectedToDesiredWifi() {
boolean connected = false;
String desiredMacAddress = "router mac address";
WifiManager wifiManager =
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifi = wifiManager.getConnectionInfo();
if (wifi != null) {
// get current router Mac address
String bssid = wifi.getBSSID();
connected = desiredMacAddress.equals(bssid);
}
return connected;
}
}
只要我們不需要代碼,免費服務,我只能推薦您,在創建此類應用程序時閱讀關於Android及其網絡/ Wifi可能性的所有可能信息。
http://developer.android.com/reference/android/net/wifi/package-summary.html
how to see if wifi is connected in android
How to get my wifi hotspot ssid in my current android system
How to get name of wifi-network out of android using android API?
Get Wifi Interface name on Android
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
(最後一個,只要你想它來檢測你的位置,以避免不必要的電話)
AndroidManifest.xml
<uses-feature android:name="android.hardware.wifi" />
嘿,非常感謝。我會閱讀這些。這是我在stackoverflow上的第一個問題。感謝您的答覆。 – ECH5030 2012-02-20 02:00:45
@ ECH5030不客氣,先生。不要忘了,然後標記一些答案,如接受,這是你只能做的。這是關閉QA網站上的問題線程的常見方式:) – 2012-02-20 14:09:17
使用標準的代碼,列出所有可用的網絡:
開始掃描
String connectivity_context = Context.WIFI_SERVICE;
final WifiManager wifi = (WifiManager) getSystemService(connectivity_context);
if (wifi.isWifiEnabled()) {
wifi.startScan();
}
註冊用於接收器的數據
IntentFilter i = new IntentFilter();
i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i) {
// TODO Auto-generated method stub
ScanWiFiActivity a = ScanWiFiActivity.instance();
WifiManager w = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> l = w.getScanResults();
a.Clear();
for (ScanResult r : l) {
//use r.SSID or r.BSSID to identify your home network and take action
a.setText(r.SSID + "" + r.level + "\r\n");
}
}
};
registerReceiver(receiver, i);
在塊工作,你的魔力,當你通過SSID或BSSID識別網絡採取行動
這是一個偉大的人! – Saaram 2013-01-14 19:55:42
我對於我的項目有完全相同的問題,並且需要一段時間才能找到解決方案。
首先,「連接到WiFi」是非常抽象的東西,事實證明是正確的。在實踐中,人們通常是指所有的以下內容:
所有這些階段(以及更多)與不同的Andoid事件相關聯。因此,事不宜遲,這裏是我的(略有修改)代碼:
public class MyService extends Activity { // or Service
//... Other stuff
BroadcastReceiver awaitIPAddress = null;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) {
//WiFi is associated
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
// Wifi info available (should be, we are associated)
if (wi.getIpAddress() != 0) {
// Lucky us, we already have an ip address.
// This happens when a connection is complete, e.g. after rekeying
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
} else {
// No ip address yet, we need to wait...
// Battery friendly method, using events
if (awaitIPAddress == null) {
awaitIPAddress = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent in) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
if (wi != null) {
if (wi.getIpAddress() != 0) {
if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) {
// ... Do your stuff here
// ...
// ...
}
}
} else {
ctx.unregisterReceiver(this);
awaitIPAddress = null;
}
}
};
// We register a new receiver for connectivity events
// (getting a new IP address for example)
context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
}
}
} else {
// wifi connection not complete, release ip address receiver if registered
if (awaitIPAddress != null) {
context.unregisterReceiver(awaitIPAddress);
awaitIPAddress = null;
}
}
}
}
};
//... Other stuff
@Override
public void onCreate() {
super.onCreate();
//... Other stuff
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
registerReceiver(receiver, filter);
//... Other stuff
}
//... Other stuff
}
另外,不要忽略了適當的權限清單:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
我強烈懷疑你還需要:
<uses-permission android:name="android.permission.INTERNET"/>
這個[工作代碼片段](http://stackoverflow.com/a/15976165/1166727)提取了從連接的無線網絡連接,在裝置的「視線」上設備和可用網絡存儲網絡。 – 2013-04-12 16:26:10