티스토리 뷰


안드로이드 기기에서 인터넷의 상태(데이터네트워크, WIFI, No Connection 등)을 확인하기 위한 좋은 글을 가져왔다.


Broadcast receiver와 Androidmanifest의 설정을 이용하여 마치 listner처럼 작동한다.

나처럼 처음 사용해보는 사람이라도 워낙 소스도 간결하여 어렵지 않게 사용할 수 있을 것이라 본다.

특히 주의할 점은 ACCESS_NEYWORK_STATE use permission을 꼭! 넣어줘야 한다는 정도?


한번만 설정해두면 어플이 실행되고 모든 Activity가 종료되기 전까지 유지된다는 장점이 있다.

개별적인 Activity에서만 사용하고싶을 때는 트릭을 조금 쓰던가..

아니면 복잡한 manifest 설정 없이 자바 코드상에서만 사용하겠다 하면 이곳에서 한번 확인해보기 바란다.

위 사이트에서도 퍼미션정도는 적용해줘야 할지 모르겠다.




If you are developing an Android app you may already fetching information from internet. While doing so there is a chance that internet connection is not available on users handset. Hence its always a good idea to check the network state before performing any task that requires internet connection.

You might also want to check what kind of internet connection is available in handset. For example is wifi currently enabled? or is mobile data network is connected.

Check Internet Connection

Here is a simple code snippet that will help you identify what kind of internet connection a user has on her device.

First we need following permission in order to access network state. Add following permission to your AndroidManifest.xml file.

Permissions required to access network state:

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

Now check following utility class NetworkUtil. It has method getConnectivityStatus which returns an int constant depending on current network connection. If wifi is enabled, this method will returnTYPE_WIFI. Similarly for mobile data network is returns TYPE_MOBILE. You got the idea!!

There is also method getConnectivityStatusString which returns current network state as a more readable string.

NetworkUtil.java

package net.viralpatel.network;
 
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
 
public class NetworkUtil {
     
    public static int TYPE_WIFI = 1;
    public static int TYPE_MOBILE = 2;
    public static int TYPE_NOT_CONNECTED = 0;
     
     
    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
 
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;
             
            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        }
        return TYPE_NOT_CONNECTED;
    }
     
    public static String getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        String status = null;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = "Wifi enabled";
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = "Mobile data enabled";
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = "Not connected to Internet";
        }
        return status;
    }
}

You can use this utility class in your android app to check the network state of the device at any moment.

Now this code will return you the current network state whenever the utility method is called. What if you want to do something in your android app when network state changes? Lets say when Wifi is disabled, you need to put your android app service to sleep so that it does not perform certain task. Now this is just one usecase. The idea is to create a hook which gets called whenever network state changes. And you can write your custom code in this hook to handle the change in network state.

Broadcast Receiver to handle changes in Network state

You can easily handle the changes in network state by creating your own Broadcast Receiver. Following is a broadcast receiver class where we handle the changes in network.

Check onReceive() method. This method will be called when state of network changes. Here we are just creating a Toast message and displaying current network state. You can write your custom code in here to handle changes in connection state.

NetworkChangeReceiver.java

package net.viralpatel.network;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
 
public class NetworkChangeReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(final Context context, final Intent intent) {
 
        String status = NetworkUtil.getConnectivityStatusString(context);
 
        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}

Once we define our BroadcastReceiver, we need to define the same in AndroidMenifest.xml file. Add following to your menifest file.

<application  ...>
     ...
        <receiver
            android:name="net.viralpatel.network.NetworkChangeReceiver"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
      ...
</application>

We defined our broadcast receiver class in menifest file. Also we defined two intentCONNECTIVITY_CHANGE and WIFI_STATE_CHANGED. Thus this will register our receiver for given intents. Whenever there is change in network state, android will fire these intents and our broadcast receiver will be called.

Below is complete AndroidMenifest.xml file.

AndroidMenifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.viralpatel.network"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver
            android:name="net.viralpatel.network.NetworkChangeReceiver"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
    </application>
 
</manifest>

Run this demo in android emulator or actual device.

When Wifi is enabled, you’ll see a Toast message with message.
android-network-change-broadcast-wifi-enabled

Now disable Wifi. The toast message will show you message that internet connection is not available.
android-network-change-broadcast-receiver-not-connected

Now enable mobile data network. The same will be show in toast message as soon as you enable mobile data connection.
android-data-connection-broadcast-receiver

Download Source Code

Browse through the source code in following Git repository:
GitHub: https://github.com/viralpatel/android-network-change-detect-example

Download complete source code:
Download: android-network-change-detect-example.zip (376 KB)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday