2012-08-28 10 views
25

Sürekli olarak İnternet ile bağlı kalacak olan Android uygulamasında çalışıyorum. İnternet kapalıysa, kullanıcıya uygun bir mesaj vermesi gerekir.İnternet dinleyicisi Android örneği

İnternet Dinleyicisi gibi bir şey var mı? veya İnternet bağlantısının olmadığı durumlarda bu olayı nasıl uygulayacağınız konusunda uyarıda bulunmalıdır.

+0

Bu, diğer Q & A yardımcı olabilir: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios

+0

http: // geliştiricisi .android.com/training/monitoring-device-state/bağlantı-monitoring.html –

cevap

48

Bunun için bir Yayın Alıcısı oluşturun ve bunu manifest dosyasına kaydedin.

İlk önce NetworkStateReceiver yeni bir sınıf oluşturun ve BroadcastReceiver'ı genişletin. Sadece

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

DÜZENLEME

Bu kod bu izni

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

Ve ekleyin:

public class NetworkStateReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
    Log.d("app","Network connectivity change"); 
    if(intent.getExtras()!=null) { 
     NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); 
     if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { 
      Log.i("app","Network "+ni.getTypeName()+" connected"); 
     } 
    } 
    if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { 
      Log.d("app","There's no network connectivity"); 
    } 
    } 
} 

"uygulama" öğesinin altında AndroidManifest.xml bu kodu koy bağlantı değişimini algılar, ancak bağlı olduğu ağın internet erişimi vardır. Bunu kontrol etmek için şu yöntemi kullanın: -

public static boolean hasActiveInternetConnection(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
      urlc.setRequestProperty("User-Agent", "Test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 
     } catch (IOException e) { 
     Log.e(LOG_TAG, "Error checking internet connection", e); 
     } 
    } else { 
    Log.d(LOG_TAG, "No network available!"); 
    } 
    return false; 
} 
+0

Buradaki örnekler: http://stackoverflow.com/questions/6176570/checking-the-networking-connectivity-using-broadcastreceiver-in-android – helios

+0

Bu çözümü denedim ama bu işe yaramaz. ayrıca super.onReceive (bağlam, niyet) de hata verir; –

+0

hata nedir? –

1

Yukarıdaki Chirag Raval kodları kesinlikle çalışır. Sorun, uygulama ön planda çalışmadığında bile dinleyicinin çağrılacağıdır.

IMHO, daha iyi bir yaklaşım, tüm uygulama aktivitelerinizdeki onResume()/onPause() yöntemlerini kaydettirmek/kaydını kaldırmaktır. Açıkçası

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver(); 

@Override 
protected void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 
    registerReceiver(stateReceiver, filter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(stateReceiver); 
} 

AndroidManifest.xml dosyadan kayıt kaldırmak: Bu kod yapmalı.

Bu çözümü kullanarak, alıcı, uygulamanızın etkinlikleri arasında geçiş yaparken de çağrılacaktır (bunları kapattığınızı varsayarak). Böyle bir durumda, aşağıdaki örnekte (denilen online) gibi statik bir bayrağı (tüm faaliyetler arasında paylaşılan) kullanın: çevrimdışı olma yaparken uygulamanızı başlayan Eğer

public class NetworkStateReceiver extends BroadcastReceiver { 

    private static boolean online = true; // we expect the app being online when starting 

    public static final String TAG = NetworkStateReceiver.class.getSimpleName(); 

    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG,"Network connectivity change"); 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = manager.getActiveNetworkInfo(); 
     if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) { 
      Log.d(TAG,"There's no network connectivity"); 
      if (online) // don't show the message if already offline 
       Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show(); 
      online = false; 
     } else { 
      Log.d(TAG,"Network "+ni.getTypeName()+" connected"); 
      if (!online) // don't show the message if already online 
       Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show(); 
      online = true; 
     } 
    } 
} 

, Tost mesajı görünür; aksi halde yalnızca bağlantıyı kaybederken/yeniden kurduğunda görünür.