2011-06-15 7 views
43

वाईफ़ाई कनेक्ट/डिस्कनेक्ट होने पर मेरी कक्षा को कौन से श्रोता को कोड को स्वचालित रूप से जांचने के लिए लागू किया जाता है?वाईफ़ाई कनेक्ट-डिस्कनेक्ट श्रोता

मैं मैन्युअल रूप से वाईफाई कनेक्शन/डिस्कनेक्शन की जांच करने में सक्षम हूं लेकिन हर बार मुझे एंड्रॉइड सेटिंग्स से वाईफ़ाई कनेक्ट करने/डिस्कनेक्ट करने की आवश्यकता होती है और फिर परिणाम के लिए अपना प्रोग्राम चलाएं।

मेरे वर्तमान कोड के रूप में सरल है के रूप में:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if (wifi.isWifiEnabled()==true) 
{ 
    tv.setText("You are connected"); 
} 
else 
{ 
    tv.setText("You are NOT connected"); 
} 

उत्तर

13

बाहर चेक जावाडोक के इन दो पृष्ठों: ConnectivityManager WiFiManager

ध्यान दें कि प्रत्येक एक प्रसारण कार्यों को परिभाषित करता है। आप प्रसारण रिसीवर पंजीकरण के बारे में अधिक जानने के लिए की जरूरत है, इस की जाँच: Programmatically register a broadcast receiver

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    if (wifi.isWifiEnabled()) { 
     tv.setText("You are connected"); 
    } else { 
     tv.setText("You are NOT connected"); 
    } 
    } 
}; 

और अपने मेनिफ़ेस्ट में आप कुछ इस तरह कर सकता है (यदि आप कोड में रिसीवर रजिस्टर नहीं करना पसंद करेंगे):

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <receiver android:name=".WiFiReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
     </intent-filter> 
    </receiver> 
</application> 

संपादित करें:

मैं जोड़ने चाहिए बल्कि प्रकट करता है, तो की तुलना में यह है कि यह अपने कोड में इस प्रसारण रिसीवर रजिस्टर करने के लिए बेहतर होगा ऐप चल रहा है, आपको केवल प्रसारण प्राप्त करने की आवश्यकता है। इसे मैनिफेस्ट में निर्दिष्ट करके आपकी प्रक्रिया को कनेक्शन परिवर्तन के बारे में अधिसूचित किया जाएगा, भले ही यह पहले नहीं चल रहा था।

+0

धन्यवाद टैनर! कोशिश करेंगे। – Neha

+1

मैं अनुशंसा करता हूं कि आप अपना कोड संपादित करें और संदर्भ के लिए स्पष्ट संदर्भ दें: "WifiManager wifi = (WifiManager) context.getSystemService (Context.WIFI_SERVICE);" अन्यथा आपको एक अलग वर्ग में उपयोग किए जाने पर "getSystemService()" के साथ त्रुटियां मिल सकती हैं। –

17

अपने स्वयं के वर्ग कि BroadcastReceiver फैली ...

public class MyNetworkMonitor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Process the Intent here 

    } 
} 

बनाएं AndroidManifest.xml

में
<receiver 
    android:name=".MyNetworkMonitor" > 
     <intent-filter> 
      <action android:name="android.net.wifi.STATE_CHANGE" /> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
</receiver> 

WIFI_STATE_CHANGED_ACTION और CONNECTIVITY_ACTION देखें आशय का उपयोग करने का एक विवरण के लिए।

+0

धन्यवाद मिस्टर स्क्वॉन्क। कोशिश करेंगे। – Neha

+0

वाईफाईमेनगर @ स्क्वॉन्क से आने वाले वे चर? – gumuruh

+0

@gumuruh WIFI_STATE_CHANGED_ACTION कनेक्टिविटी प्रबंधक के लिए वाईफाई प्रबंधक वर्ग और CONNECTIVITY_ACTION से संबंधित है। आप अधिक कनेक्शन प्रकारों की जांच कर सकते हैं, यानी यदि मोबाइल नेटवर्क उपलब्ध है, तो आपको सक्रिय नेटवर्क से पूछना चाहिए और वहां आप नेटवर्कइन्फो (-> टाइप) कनेक्शन प्रबंधक प्राप्त कर सकते हैं। TYPE_MOBILE ... –

67

वास्तव में आप चाहे वाई-फाई है के लिए जाँच कर रहे हैं सक्षम, जरूरी नहीं है कि यह जुड़े है कि। इसका मतलब यह है कि फोन पर वाई-फाई मोड सक्षम है और वाई-फाई नेटवर्क से कनेक्ट करने में सक्षम है।

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) {  
     ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
      Log.d("WifiReceiver", "Have Wifi Connection"); 
     else 
      Log.d("WifiReceiver", "Don't have Wifi Connection");  
    } 
}; 

सक्रिय नेटवर्क की जानकारी आप अपने AndroidManifest के लिए निम्न का उपयोग करता है-अनुमति जोड़नी होगी उपयोग करने के लिए:

यह कैसे मैं अपने प्रसारण रिसीवर में वास्तविक वाई-फाई कनेक्शन के लिए सुन रहा हूँ है। xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

और निम्नलिखित आशय रिसीवर (या आप इस प्रोग्राम के रूप में जोड़ सकते हैं ...)

<!-- Receive Wi-Fi connection state changes --> 
<receiver android:name=".WifiReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

संपादित करें: लॉलीपॉप में, जॉब शेड्यूलिंग मदद कर सकती है यदि आप एक निष्पादित नेटवर्क कनेक्शन से कनेक्ट करते समय कोई कार्रवाई करने की सोच रहे हैं।एक नज़र डालें: http://developer.android.com/about/versions/android-5.0.html#Power


संपादित करें 2: एक अन्य विचार है कि मेरे जवाब की जांच नहीं करता आप इंटरनेट से कनेक्शन होता है। आप एक वाई-फाई नेटवर्क जो आपको प्रवेश करने की आवश्यकता है से जुड़ा जा सकता है यहाँ एक उपयोगी "IsOnline()" है की जाँच करें:। https://stackoverflow.com/a/27312494/1140744

+0

यह कमाल है लेकिन मैं अपनी गतिविधि के अंदर इसका उपयोग कैसे कर सकता हूं? – sabsab

+0

इसे दो बार बुलाया गया। मुझे यह दो बार मिल रहा है, वाईफाई रिसीवर: वाईफ़ाई कनेक्शन –

+0

'android.net.conn.CONNECTIVITY_CHANGE' को बहिष्कृत किया गया है। अब समाधान क्या है? –

3

में अनुमति निम्नलिखित AndroidManifest.xml जोड़ने।

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

नई रिसीवर कक्षा बनाएं।

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

     if (activeNetInfo != null 
      && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show(); 
     } 
    } 

और करने के लिए AndroidManifest.xml फ़ाइल है कि रिसीवर वर्ग जोड़ें।

<receiver android:name="ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
1

सब्सब के जवाब में। कनेक्टिविटी चेंज ब्रॉडकास्ट रिसीवर में हुक करने के लिए मैंने वारबी के जवाब का उपयोग किया और स्थिर तरीकों के साथ एक वर्ग जोड़ा।

public class WifiHelper 
{ 
    private static boolean isConnectedToWifi; 
    private static WifiConnectionChange sListener; 

    public interface WifiConnectionChange { 
     void wifiConnected(boolean connected); 
    } 

    /** 
    * Only used by Connectivity_Change broadcast receiver 
    * @param connected 
    */ 
    public static void setWifiConnected(boolean connected) { 
     isConnectedToWifi = connected; 
     if (sListener!=null) 
     { 
      sListener.wifiConnected(connected); 
      sListener = null; 
     } 
    } 

    public static void setWifiListener(WifiConnectionChange listener) { 
     sListener = listener; 
    } 
} 

फिर मैंने ऊपर दिखाए गए पहले उत्तर पर रिसीवर कक्षा में परिवर्तन किए।

public class ConnectivityReceiver extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
    { 
     Log.d("WifiReceiver", "Have Wifi Connection"); 
     WifiHelper.setWifiConnected(true); 
    } else 
    { 
     Log.d("WifiReceiver", "Don't have Wifi Connection"); 
     WifiHelper.setWifiConnected(false); 
    } 

} 
} 

अंत में, आपकी गतिविधि में आप इस कॉलबैक का उपयोग करने के लिए श्रोता जोड़ सकते हैं।

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING); 
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange() 
    { 
     @Override 
     public void wifiConnected(boolean connected) 
     { 
      //Do logic here 
     } 
    }); 

कॉलबैक आग के बाद श्रोता को हटा दिया गया है, ऐसा इसलिए है क्योंकि यह एक स्थिर श्रोता है। वैसे भी यह कार्यान्वयन मेरे लिए काम करता है और आपकी गतिविधि में शामिल होने का एक तरीका है, या कहीं भी यह स्थिर है।