프로그래밍/android

android PIP 예제 샘플 구현. 생각보다 쉽네 ~

-샤리- 2021. 5. 18. 14:28

안드로이드 8.0 Oreo 부터 지원되는 PIP(picture-in-picture) 기능을 사용해야 할 일이 생겨서 검색 조금 해본 결과 생각보다 쉽다는 것을 알게 되었다. 권한을 따로 요청할 필요도 없이 PIP가 필요한 activity에 옵션만 넣어주면 끝. 굳이 이 포스팅을 보지 않아도 안드로이드 개발자 사이트에 다 나와 있다.

https://developer.android.com/guide/topics/ui/picture-in-picture?hl=ko 

 

PIP 모드 지원  |  Android 개발자  |  Android Developers

Android 8.0에서는 활동을 PIP 모드로 실행할 수 있습니다.

developer.android.com

 

 

▣ 코드 확인


AndroidManifest.xml

<activity android:name=".YourActivity"
            android:supportsPictureInPicture="true"
            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>

 

YourActivity.kt

// PictureInPictureParams builder 선언
var pipParamBuilder: PictureInPictureParams.Builder? = null
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        pipParamBuilder = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            PictureInPictureParams.Builder()
        } else {
            null
        }

        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener {
            minimize()
        }
    }
// pip mode로 변경
private fun minimize(){
        when {
            android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O -> {
            	//	pip 창 사이즈 
                val aspectRational = Rational(100, 100)
                pipParamBuilder?.let { ppBuilder ->
                    ppBuilder.setAspectRatio(aspectRational)?.build()
                    enterPictureInPictureMode(ppBuilder.build())
                }
            }
            android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N -> {
            	// deprecated
                enterPictureInPictureMode()
            }
            else -> {
                // 지원 불가
            }
        }
    }
override fun onUserLeaveHint() {
        super.onUserLeaveHint()
        minimize()
    }

    override fun onPause() {
        super.onPause()
        minimize()
    }
// pip <--> 앱 전환시
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration?) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
        
        when(isInPictureInPictureMode) {
            true -> {
                Log.d("log", "pip 모드")
            }
            else -> {
                Log.d("log", "앱 활성 모드")
            }
        }
    }