안드로이드 관련 포스팅 목록
2020/06/23 - [Android] - 안드로이드 버튼 클릭 이벤트 처리 예제 - 3
2020/06/23 - [Android] - 안드로이드 버튼 클릭 이벤트 처리 예제 - 2
2020/06/22 - [Android] - 안드로이드 버튼 클릭 이벤트 처리 예제 - 1
2020/06/21 - [Android] - 안드로이드 타이틀바 제거
2020/06/21 - [Android] - 안드로이드 인터넷 권한
2020/06/21 - [Android] - 안드로이드 자동 화면 회전 방지
목차
API의 필요성
안녕하세요 오늘은 안드로이드 핸드폰이 현재 Wifi에 연결되어있는지 확인하는 방법이 대해 알아보겠습니다. 와이파이란 공기 중의 특정 주파수에 데이터를 송수신하는 네트워킹 관련 기능을 의미합니다. 우리가 지하철이나 버스, 카페, 공공장소 등 에서 사용하는 wifi들이 모두 같습니다.
다만, 아무도 모르는 모두와 같이 쓸 수 있는 wifi는 내가 통신하고 있는 내용들이 유출될 수 있다는 문제점이 존재합니다. 따라서 디바이스 제한 정책(MDM) 과 관련한 API들을 안드로이드에서 제공하고 있습니다. 만약 카페에가서 누구에게나 열려있는 Wifi를 쓰고 다른 사람에게 내 사진 동영상, SNS 채팅 내용들을 도청당하면 너무도 위험하겠죠?
위와 같은 이유로 지금 나의 핸드폰이 wifi에 연결되어있는 상태라면 서비스를 사용하지 못하도록 한다던지, 아니면 wifi에 연결되어있지 않다면 파일 다운로드와 같은 데이터가 많이 필요한 서비스를 사용하지 못하도록 한다던지의 행동이 필요합니다.
이제 이런 기능을 제공하는 API가 무엇이 있는지 확인해보겠습니다.
메소드 설명
---------------------------------------------------------------------
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
# 인텐트 필터
ConnectivityManager.CONNECTIVITY_ACTION
- 안드로이드에서 제공하는 WIFI 상태 체크를 위한 인텐트 필터명
---------------------------------------------------------------------
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
# 네트워트 상태 확인
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
- Receiver를 통해 전달된 인텐트에서 ConnectivityManager.EXTRA_NETWORK_INFO 의 상태 값을 가져올 수 있다
---------------------------------------------------------------------
networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected();
# 연결 네트워크 타입과 연결된 상태인지 확인
- networkInfo.getType()을 통해 연결된 네트워크의 타입을 가져온다. (통신사 네트워크 또는 wifi 등)
- networkInfo.isConnected() 를 통해 연결되어있는 상태인지 확인한다.
네트워크 상태를 확인하기 위한 필수 API들을 파악합니다.
리시버 구현
BroadcastReceiver wifiEventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context_, Intent intent) {
String action = intent.getAction();
if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
Toast.makeText(this, "WIFI 연결 상태입니다.", Toast.LENGTH_SHORT).show();
}
}
}
};
위와 같이 wifi의 상태를 받았을 때 각 행동이 맞게 처리하도록 하는 코드를 추가합니다. 저의 경우는 메인 엑티비티에 리시버를 추가하였습니다.
wifi가 연결된 상태일 때는 저 리시버가 호출될 것입니다.
각 상황에 맞게 로그를 출력하도록 예제를 구현하겠습니다.
리시버 등록
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.registerReceiver(wifiEventReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
우리는 그냥 앱이 실행되어 메인 화면이 나타나는 순간 wifi의 상태를 알 수 있는 리시버를 등록하도록 하겠습니다. 만약 리시버 등록 시점을 바꿔야할 필요가 있다면 해당 조건이나 엑티비티가 로드되었을 때 시점에서 등록하면 됩니다.
다만 앱이 실행되자마자 wifi상태를 확인하지는 못하겠지요?
전체 코드
package com.newer.wifichecker;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.registerReceiver(wifiEventReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
private final BroadcastReceiver wifiEventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context_, Intent intent) {
String action = intent.getAction();
if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
Toast.makeText(context_, "WIFI 연결 상태입니다.", Toast.LENGTH_SHORT).show();
}
}
}
};
}
결과
위와 같이 앱이 실행되면 Wifi가 연결되어있는지 확인하고 Toast(알림창)을 띄우는 것을 알 수 있었습니다. 다음 포스팅에서는 안드로이드 어플리케이션에서 USB 연결 상태를 체크하는 방법에 대하여 알아보겠습니다.