मुझे मेरी एक परियोजना के लिए बिल्कुल वही समस्या थी और समाधान खोजने में कुछ समय लगा।
सबसे पहले, "वाईफाई से कनेक्ट करना" कुछ बहुत ही अमूर्त है, और यह ठीक से निकलता है। अभ्यास में, लोगों को आम तौर निम्न में से सभी मतलब है:
- WiFi पहुंच बिंदु
- पहुँच बिंदु
- नेटवर्क से एक आईपी पता मिल गया के साथ जुड़े के साथ प्रमाणीकृत
इन सभी चरणों (और कई और) विभिन्न एंडोइड घटनाओं से जुड़े हुए हैं। तो, आगे की हलचल के बिना, यहाँ मेरी (थोड़ा संशोधित) कोड है:
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) जुड़ा वाईफाई, उपकरण की "दृष्टि" में डिवाइस और उपलब्ध नेटवर्क पर संग्रहीत नेटवर्क से सब कुछ निकालता है। –