안드로이드 프레임워크 프로그래밍(6) [Wi-Fi 접속 확인 Toast 만들기]

 최근 안드로이드 프레임워크 공부를 해보던 중 한 번 도전하고 싶었던 것이 있었습니다. 바로 갤럭시 S2에서 지원하던 Wi-Fi 접속 알림창이었습니다.


 ※갤럭시 S2 JellyBean 4.1에서의 모습입니다.

 위에서 보는 바와 같이 안드로이드 기기가 Wi-Fi에 접속하면 Framework를 통해 Toast가 이를 알려주는 모습을 보고 이를 Nexus 폰에도 적용해보자는 마음으로 도전하게 되었습니다.


※본 포스팅은 Nexus5 KitKat 4.4.4 환경에서 제작되었음을 알립니다.


1.  아래 굵은 표시로 추가된 소스코드를 안드로이드 소스에 추가합니다.

/frameworks/base/services/java/com/android/server/ConnectivityService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        @Override
        public void handleMessage(Message msg) {
            NetworkInfo info;
            switch (msg.what) {
                case NetworkStateTracker.EVENT_STATE_CHANGED: {
                    info = (NetworkInfo) msg.obj;
                    NetworkInfo.State state = info.getState();
 
                    if (VDBG || (state == NetworkInfo.State.CONNECTED) ||
                            (state == NetworkInfo.State.DISCONNECTED) ||
                            (state == NetworkInfo.State.SUSPENDED)) {
                        log("ConnectivityChange for " +
                            info.getTypeName() + ": " +
                            state + "/" + info.getDetailedState());
        //APPEND
 
        if ( state == NetworkInfo.State.CONNECTED ){
            Toast.makeText(mContext, info.getExtraInfo().
                substring(1,info.getExtraInfo().length() - 1)
                + "에 연결되었습니다.", Toast.LENGTH_SHORT).show();
        }
 
        //END
                    }
 
                    // Since mobile has the notion of a network/apn that can be used for
                    // provisioning we need to check every time we're connected as
                    // CaptiveProtalTracker won't detected it because DCT doesn't report it
                    // as connected as ACTION_ANY_DATA_CONNECTION_STATE_CHANGED instead its
                    // reported as ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN. Which
                    // is received by MDST and sent here as EVENT_STATE_CHANGED.
                    if (ConnectivityManager.isNetworkTypeMobile(info.getType())
                            && (0 != Settings.Global.getInt(mContext.getContentResolver(),
                                        Settings.Global.DEVICE_PROVISIONED, 0))
                            && (((state == NetworkInfo.State.CONNECTED)
                                    && (info.getType() == ConnectivityManager.TYPE_MOBILE))
                                || info.isConnectedToProvisioningNetwork())) {
                        log("ConnectivityChange checkMobileProvisioning for"
                                + " TYPE_MOBILE or ProvisioningNetwork");
                        checkMobileProvisioning(CheckMp.MAX_TIMEOUT_MS);
                    }
    }
 
 
cs


2. 적용된 소스코드를 빌드하여 이미지를 새로 만듭니다.

$ make -j4


3. 안드로이드 기기에 이미지를 올린 후 동작을 확인합니다.