본문 바로가기
개발/안드로이드

안드로이드 12 변경사항

by darksilber 2022. 2. 14.
반응형

출처 - https://kkangsnote.tistory.com/131

 

Toast Icon

 

Toast API 에는 변경사항이 없는데 출력되는 모습에 변화

Toast 문자열에 기본 App Icon 이미지 출력

 

 

 

WindowMetrics

 

디바이스 사이즈 정보 획득에 사용되었던 DisplayMetrics 는 deprecation

WindowMetrics 를 사용할 것을 권장

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics
    val insets: Insets = windowMetrics.windowInsets
        .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
    windowMetrics.bounds.width() - insets.left - insets.right


    binding.textView2.text = """
       
        insets.left : ${insets.left}
        insets.right : ${insets.right}
        insets.top : ${insets.top}
        insets.bottom : ${insets.bottom}
       
        windowMetrics.bounds.width() : ${windowMetrics.bounds.width()}
        windowMetrics.bounds.height() : ${windowMetrics.bounds.height()}
       
        windowMetrics.bounds.left : ${windowMetrics.bounds.left}
        windowMetrics.bounds.right : ${windowMetrics.bounds.right}
        windowMetrics.bounds.top : ${windowMetrics.bounds.top}
        windowMetrics.bounds.bottom : ${windowMetrics.bounds.bottom}
       
        window width : ${windowMetrics.bounds.width() - insets.left - insets.right}
       
        """
} else {
    val display = windowManager.defaultDisplay
    val displayMetrics = DisplayMetrics()
    display?.getRealMetrics(displayMetrics)

    binding.textView2.text = """
        widthPixels : ${displayMetrics.widthPixels}
        heightPixels : ${displayMetrics.heightPixels}
        densityDpi : ${displayMetrics.densityDpi}
        density : ${displayMetrics.density}
        scaledDensity : ${displayMetrics.scaledDensity}
        xdpi : ${displayMetrics.xdpi}
        ydpi : ${displayMetrics.ydpi}
       """
}

 

VibratorManager

 

Vibrator deprecation

VibratorManager 사용 권장

 

val vibrator  = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager =  this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
    vibratorManager.defaultVibrator;
} else {
    getSystemService(VIBRATOR_SERVICE) as Vibrator
}

 

PendingIntent flag 값 지정

 

PendingIntent  flag 값을 immutable 혹은 mutable 둘중 하나를 주어야 함.

안그러면 런타임 에러발생

 

val intent = Intent(this, DetailActivity::class.java)
val pendingIntent =
    PendingIntent.getActivity(this, 10, intent,
        PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent)

 

Activity Lifecycle 변경

 

12 버전부터 root activity 의 경우 back button 에 의해 종료되지 않는다.

onStop() 까지 호출되고  onDestory() 가 호출되지 않는다.

물론 root activity 가 아니면 back button 에 의해 종료된다.

 

finish() 에 의한 종료는 root activity  onDestory 호출된다.

 

 

 

TelephonyCallback 

 

PhoneStateListener deprecated

TelephonyCallback 으로 대체

 

TelephonyManager 에게 TelephonyCallback 을 구현한 객체를 등록하면 상태 변화가 발생했을 때 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) {
                when (state) {
                    TelephonyManager.CALL_STATE_IDLE -> {
                        Log.d("kkang", "IDLE....")
                    }
                    TelephonyManager.CALL_STATE_OFFHOOK -> {
                        Log.d("kkang", "OFFHOOK....")
                    }
                    TelephonyManager.CALL_STATE_RINGING -> {
                        Log.d("kkang", "RINGING....")
                    }
                }
            }
        })


}

 

TelephonyManager  TelephonyCallback 등록은 registerTelephonyCallback() 함수를 이용해 등록하며 등록되는 객체는 TelephonyCallback 을 상속받은 객체이어야 한다.

그리고 위의 코드처럼 TelephonyCallback.CallStateListener 라는 인터페이스를 구현한 객체이어야 하는데 인터페이스는 감지하고자 하는 상태에 따라 여러가지가 준비되어 있어야 한다.

위의 코드에서 이용한 TelephonyCallback.CallStateListener 는 전화가 걸려오는 상황을 감지할 때 사용되는 인터페이스이다.

TelephonyCallback.CallStateListener 이외에 다양한 상황 감지를 위해 여러  인터페이스들이 준비되어 있으며 대표적인 것들을 소개하면 아래와 같다.

 

TelephonyCallback.CellLocationListener  cell 위치 변경 감지

TelephonyCallback.ServiceStateListener – 서비스 상태 변경 감지

TelephonyCallback.SignalStrengthsListener – 신호세기 변경 감지

TelephonyCallback.DataActivityListener – 데이터 송수신 상태 변경 감지

TelephonyCallback.DataConnectionStateListener – 데이터 커넥션 상태 변경 감지

TelephonyCallback.CallStateListener – 전화 상태 변경 감지

 

 

Location 퍼미션

 

 

12 버전부터 ACCESS_FINE_LOCATION 을 걸려면 ACCESS_COARSE_LOCATION 을 같이 걸어줘야 한다.

 

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



반응형

댓글