#11 [Kotlin] 호환성 및 퍼미션

정상준·2022년 10월 28일
0

kotlin

목록 보기
11/26
post-thumbnail
post-custom-banner

📝핸드폰 크기의 호환성

안드로이드폰은 다양한 크기가 있는데 폰 크기의 호환성은 안드로이드 시스템에서 도와주는 부분이 있고 개발자가 직접 코드에서 해결해야 하는 부분이 있다.

안드로이드 기기의 크기 구분
|크기|설명|
|ldpi|저밀도 화면이며 ~ 120dpi|
|mdpi|중밀도 화면이며 ~ 160dpi|
|hdpi|고밀도 화면이며 ~ 240dpi|
|xhdpi|초고밀도 화면이며 ~ 320dpi|
|xxhdpi|초초고밀도 화면이며 ~ 480dpi|
|xxxhdpi|초초초고밀도 화면이며 ~ 640dpi|

dpi는 dots epr inch의 줄임말로 1인치 안에 있는 도트의 개수를 의미한다.

안드로이드에서 앱을 개발할 때 크기 지정에 사용할 수 있는 단위

  • dp :스크린의 물리적 밀도에 기반을 둔 단위
  • sp : dp와 유사하며 글꼴 크기에 적용
  • pt : 스크린 크기의 1/72을 1pt로 함
  • px : 픽셀
  • mm : 밀리미터
  • in : 인치

안드로이드에서는 논리적인 단위로 dp와 sp 크기를 지정하길 권한다. dp는 일반 크기, sp는 글꼴 크기를 의미한다.

화면 정보 가져오기

기기의 크기 정보를 가져오는 방법은 API레벨 30버전과 이전 버전이 차이가 있다. 30 이전 버전에서는 DisplayMetrics로 크기 정보를 가져왔지만 30 버전부터는 이 방법을 지원하지 않고, WindowMetrics를 이용한다.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
     val windowMetric: WindowMetrics = windowManager.currentWindowMetrics
     binding.textView.text = "${windowMetrics.bounds.width()},
                             ${windowMetrics.bounds.height()}"
}else{
     val display = windowManager.defaultDisplay
     val displayMetrics = DisplayMetrics()
     display?.getRealMetrics(displayMetrics)
     binding.textView.text = "${displayMetrics.widthPixels},
                              ${displayMetrics.heightPixcels}"

API 레벨 호환성 고려하기

minSdk 21
targetSdk 31

만약 위와 같이 설정했다면 targetSdk에 설정한 31 버전의 API로 앱을 개발하라는 의미이다. 그런데 minSdk를 21로 지정했으므로 이 앱은 21 버전 기기부터 설치할 수 있다. 결국 이 앱은 31버전의 API로 개발하지만 21 버전 기기에서도 오류가 발생하지 않고 동작해야 한다. 사용할 API가 추가된 상위 버전에서는 문제가 없지만 하위 버전에서는 오류가 발생한다. 하지만 API 레벨 호환성에 문제가 있는 API를 사용할 때는 @기호로 시작하는 애너테이션을 추가해 오류를 해결할 수 있다.

API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부 위에 @RequiresApi나 @targetApi애너테이션을 추가하면 안드로이드 스튜디오에서 오류가 발생하지 않는다. 하지만 API호환성 애너테이션은 안드로이드 스튜디오에서 오류를 무시하는 설정일 뿐 앱이 실행될 때 API 레벨 호환성 문제를 막으려면 직접 코드로 처리해 줘야 한다.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
      var builder: Notification.Builder = Notification.Builder(this,"1")
          .setStyle(
                Notification.CalliStyle.forIncomingCall(caller,declineIntent, anserIntent)
          )
}

Build.VERSION.SDK_INT : 앱이 실행되는 기기의 API 레벨

📝퍼미션 설정하기

다이얼로그란 사용자와 상호 작용하는 대화상자이다.

토스트메시지 띄우기

토스트는 화면 아래쪽에 잠깐 보였다가 사라지는 문자열을 의미하며 사용자에게 간단한 메시지로 특정한 상황을 알릴 때 사용한다.

토스트는 Toast의 makeText() 함수로 만든다.

  • open static fun makeText(context: Context!, text: CharSequence!, duration: Int): Toast!
  • open static fun makeText(context: Context!, resId: Int, duration: Int): Toast!

makeText() 함수의 두 번째 매개변수가 출력할 문자열이며, 세 번째 매개변수는 토스트가 화면에 출력되는 시간으로 보통 Toast.LENGTH_SHORT와 Toast.LENGTH_LONG을 사용한다.

val toast = Toast.makeText(this, "Test 출력", Toast.LENGTH_SHORT)toast.show()

makeText() 함수로 만든 토스트는 show() 함수로 화면에 출력한다. 그런데 토스트는 makeText()함수를 이용하지 않고 다음의 세터 함수로 만들 수도 있다.

  • open fun setDuration(duration: Int) Unit
  • open fun setGravity(gravity: Int, xOffset: Int, yOffset: Int): Unit
  • open fun setMargin(horizontalMargin: Float, verticalMargin: Float): Unit
  • open fun setText(resId: Int): Unit

setDuration(), setText() 함수를 이용하면 문자열이나 화면에 보이는 시간을 설정할 수 있으며 setGravity()나 setMargin() 함수를 이용하면 토스트가 뜨는 위치를 정할 수 있다.

토스트는 간단한 문자여를 화면에 출력하는 목적으로 show()함수로 출력한 후 일정한 시간이 지났을 때 자동으로 사라지게 만들면 된다. 그런데 토스트가 화면에 보이거나 사라지는 순간을 콜백으로 감지해 특정 로직을 수행하게 할 수 있다.

 val toast = Toast.makeText(this,"test",Toast.LENGTH_SHORT)
        toast.addCallback(
            @RequiresApi(Build.VERSION_CODES.R)
            object : Toast.Callback(){
                override fun onToastHidden() {
                    super.onToastHidden()
                    Log.d("Joung","toast hidden")
                }

                override fun onToastShown() {
                    super.onToastShown()
                    Log.d("Joung","toast shown")
                }
            }
        )

토스트의 콜백을 등록하려면 Toast.Callback 타입의 객체를 토스트 객체의 addCallback()함수로 등록해 주면 된다. 이렇게 하면 화면에 토스트가 뜨는 순간 자동으로 콜백 객체의 onToastShown()함수가 호출되며 화면에서 사라지는 순간 onToastHidden() 함수가 자동으로 호출된다.

profile
안드로이드개발자
post-custom-banner

0개의 댓글