2010-02-19 16 views
38

Ağa bağlı, bağlantısız vb. Ağ işlemleri için yayın almam gerekir. Bu amaçla bir yayın alıcısı kullanıyorum. Herkes bana ağ olayları için yakalamak için hangi niyet eylemi gerektiğini söyleyebilirim, şu anda internette yaptığım aramaya göre android.net.ConnectivityManager.CONNECTIVITY_ACTION kullanıyorum. İşte Android sdk'deki ağ olayları için kasıtlı eylem

benim yayın alıcısı sınıftır:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

ve ben de ağ durumunu erişmek için izin ekledik:

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

Ben Bildiri dosyasının

bu sınıf ilan ettiler nasıl
<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

Lütfen bana hatalı davranıyorsam doğru niyet eylemini tavsiye edin VEYA başka bir yol varsa ağ olaylarını yakalamak için.

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

<receiver android:name=".receiver.ConnectivityReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

:

cevap

51

İşte çalışan bir örnek.

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

benim testine göre ben herhangi iznine ihtiyacım yok wlan'ın şimdi yukarı/aşağı mı, yoksa 3g'nin şimdi mi yoksa aşağı mı olduğunu yayınlar. Biraz kafam karıştı, android.net.conn.CONNECTIVITY_CHANGE sonra ne için iyi? –

+0

Yeniden bakarsanız, CONNECTIVITY_CHANGE öğesinin bir izin olmadığını, bir amaç alıcısı kaydettirdiğini görürsünüz (alternatif olarak kodda yapabilirsiniz). – Hamid

+0

Cevap, soruyla aynı görünüyor. Peki neden cevaptan önce çalışmadı? –

5

Yanchenko cevabı çok faydalıdır, sadece bağlantı durumunu almak için biraz basitleştirerek ediyorum, aşağıda OnReceive değiştirmek edin:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

, android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY farkında mısınız? Bağlantının olup olmadığını söyleyen API düzeyi 1'den beri Intent ekstralarında ekstra bir boolean var. –

+1

Dünkü yorumuyla ilgili olarak, bunun kesin olmadığını fark ettim. EXTRA_NO_CONNECTIVITY, en azından bazı durumlarda, herhangi bir bağlantı yoksa, sadece Intent ekstralarına eklenmiştir. Yani getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) ile erişilmesi, eğer hiçbir bağlantı yoksa ve herhangi bir bağlantı varsa yanlış olduğunda bir boole vermesi beklenir. Ayrıca, bu cevaptaki kod bir ** karşıt modeldir ** çünkü analiz sınırlıdır. Bluetooth tethering, USB tethering veya LAN bağlantısı algılamayacaktır. Bunu yapma. –

+2

Bu kod için atıfta bulunan, Ravi'yi unutmuş olarak görme: http://stackoverflow.com/a/4239410/182653 – paulw1128

İlgili konular