티스토리 뷰

단말의 인터넷 연결 상태를 확인하고, 연결이 되어 있지 않다면 어떤 에러 메시지나 엑티비티를 띄우기 위해서는 ConectivityService를 활용하면 된다. 

 

딱히 어려운 건 아니니 바로 확인해보자.


◎MainActivity.java

package com.example.samplesensor;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    TextView textView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkConnectivity();
            }
        });

    }

    public void checkConnectivity() {
        ConnectivityManager connectivityManager =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        Network nw = connectivityManager.getActiveNetwork();
        if(nw != null) {
            NetworkCapabilities actNw = connectivityManager.getNetworkCapabilities(nw);
            if(actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) println("WIFI");
            else if(actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) println("MOBILE");
            else if(actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) println("ETHERNET");

        } else {
            println("데이터 통신 불가");
        }
    }

    public void println(String data) {
        textView.append(data + "\n");
    }
}


위와 같이 버튼을 눌러 인터넷 연결 상태를 확인하는 방법은 사용할 일이 거의 없는 코드이다. 

 

보통은 브로드캐스트 수신자를 이용해서 연결 상태가 바뀌는 시점에 인터넷 연결 상태를 바로 확인하여 인터넷 연결을 다시 시도하게끔 코드를 작성한다. 

 

다음은 무선랜이 끊어졌는지 아닌지에 대한 정보를 브로드캐스트 수신자를 받아 현재 인터넷 연결 상태를 출력하는 예제이다.

 

◎AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.samplesensor">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    
    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.SampleSensor">
        <activity
                android:name=".MainActivity"
                android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

 

◎MainActivity.java

package com.example.samplesensor;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    WiFiReceiver wiFiReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView.findViewById(R.id.textView2);
        wiFiReceiver = new WiFiReceiver();
    }

    @Override
    protected void onPause() {
        super.onPause();

        // 브로드캐스트 수신자 등록 해제
        unregisterReceiver(wiFiReceiver);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // 수신자가 받을 메시지를 지정하기 위한 IntentFilter
        IntentFilter filter = new IntentFilter();

        // 무선랜의 상태와 네트워크 상태를 전달
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

        // 브로드캐스트 수신자 등록
        registerReceiver(wiFiReceiver, filter);
    }

    class WiFiReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // WIFI 상태 체크
            if(action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
                int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
                if(state == WifiManager.WIFI_STATE_ENABLED) {
                    println("WiFi enabled");
                } else if(state == WifiManager.WIFI_STATE_DISABLED) {
                    println("WiFi disabled");
                }
            } else if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
                NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
                String ssid = manager.getConnectionInfo().getSSID();

                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    println("Connected : " + ssid);
                } else if (info.getState() == NetworkInfo.State.DISCONNECTED) {
                    println("Disconnected : " + ssid);
                }
            }
        }
    }

    public void println(String data) {
        textView.append(data + "\n");
    }
}

 

반응형

'Mobile > Android' 카테고리의 다른 글

[Android] Build / APK 추출  (0) 2022.05.03
[Android] Multi Window  (0) 2022.05.01
[Android] 시스템 서비스 활용  (0) 2022.04.30
[Android] 센서 이해하기  (0) 2022.04.30
[Android] 알림 3: 푸시 서비스 사용하기  (0) 2022.04.27
Comments