스마트폰 정보

k_hyun·2023년 3월 27일
0

전화 상태 변화 감지

전화가 걸려오는 순간, 서비스 상태가 변경되는 순간을 감지하고 싶은 경우가 있다.

스마트폰의 상태를 파악하는 방법은 두가지 존재한다.

PhoneStateListener

API레벨 31에서 deprecated 되었다.

PhoneStateListener를 상속받은 클래스의 객체를 TelephonyManager에 등록해서 사용한다.
그러면 스마트폰의 전화 관련 상태가 바뀔 때마다 PhoneStateListener의 다음 함수가 자동으로 호출된다.

  • onServiceStateChanged
  • onCallForwardingIndicatorChanged
  • onDataActivity
    ... 등 여러 함수가 존재하나, 필요한 함수만 재정의해 놓으면 앱에서 변화를 감지한다.
// 상태 변화 감지
val phoneStateListener = object : PhoneStateListener() {
	override fun onServiceStateChanged(serviceState: ServiceState?) {
    	super.onServiceStateChanged(serviceState)
        ...
    }
}    

// 전화 매니저 얻기
val manager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE)

// 상태 감지 해제
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)

listen() 함수의 두 번째 매개변수에는 감지할 상태를 지정한다.

TelephonyCallback

12버전 부터는 스마트폰의 상태 변화를 감지할 때 TelephonyCallback을 이용한다.
TelephonyCallback을 구현한 객체를 TelephonyManager에 등록하면 TelephonyCallback의 함수가 자동으로 호출된다.

telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
	telephonyManager.registerTelephonyCallback(
    	mainExecutor,
        object : TelephonyCallback(), TelephonyCallback.CallStateListener {
        	override fun onCallStateChanged(state: Int) {
            	...
            }
        }
    )
}    

TelephonyCallback을 TelephonyManager에 등록할 때는 registerTelephonyCallback() 함수를 이용한다.

위 코드가 정상적으로 실행되려면 아래의 퍼미션을 등록해야 한다.

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

네트워크 제공 국가, 사업자, 전화번호

TelephonyManager는 네트워크 제공 국가, 사업자, 전화번호를 반환하는 함수를 제공한다.

  • getNetworkContryIso() : 네트워크 제공 국가
  • getNetworkOperatorName() : 네트워크 제공 사업자

사용자 전화번호를 추출하려면 아래 퍼미션이 필요하다.

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

사용자 스마트폰의 전화번호를 추출하는 방법은 33 버전부터는 SubscriptionManager의 getPhoneNumber()가 권장된다.

이전으로는 TelephonyManager의 getLine1Number() 함수를 사용한다.

네트워크 접속 정보

네트워크 접속 정보를 파악할 때는 ConnectivityManager를 이용한다.

아래 퍼미션을 선언해야 한다.

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

getActiveNetwork()

API 레벨 23 이후로는 ConnectivityManager의 getActiveNetwork() 함수로 Network 객체를 얻어서 이용한다.

하위 버전은 ConnectivityManager의 getActiveNetworkInfo() 함수를 이용해 NetworkInfo 객체를 얻어야 한다.

requestNetwork()

ConnectivityManager 클래스의 requestNetwork() 함수를 이용할 수 있다.

아래의 퍼미션이 필요하다.

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

0개의 댓글