2019.01.03
안녕하세요 이번에는 "Only fullscreen opaque activities can request orientation"오류를 대처하는 방법에 대해서 알아보겠습니다.
해당 오류는 TargetSdk 27이상으로하는 앱의 Android OS 8.0에서 투명Activity에 가로/세로 화면고정을 했을때 나타나는 현상입니다.
<style name="Theme.Translucent">
<item name="windowIsTranslucent">true</item>
</style>
<activity
android:name=".TestActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent">
</activity>
or
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
이렇게 투명 Acitivity에서 화면전화에 대해서 고정으로 설정할경우 앱은 "Only fullscreen opaque activities can request orientation" 오류를 나타내며 죽게됩니다.
여기에 대한 대청 방안으로는 상권님의 블로그에 자세히 설명되어있으며, 설명되어있지 않은 1가지 대처방안에 대해서 다루도록 하겠습니다.
우선 문제점으로는 모든 액티비티에서 세로고정을 해두었지만 특정 Activity에서 가로보기를 지원해야할 경우가 있었습니다.(동영상 플레이어) 그럴경우 아래와 같은 코드로 센서로 가로/세로를 지정할 수 있게 처리할 수 있습니다.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
하지만 특정뷰에서 가로보기를 지원해야할 경우 아래와 같이 처리하면서 문제가 발생했습니다.
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O) { }
문제점
1. Android OS 8.0인 디바이스에서는 가로전환이 되지 않는다.
2. 투명액티비티에서만 위와 같은 코드를 넣으면 투명액티비티에서는 화면 회전이 일어난다.
3. 투명액티비티를 세로로 고정하기위해서 코드를 작성하면 8.0 디바이스에서는 앱이 죽는다.
위 3가지 방법을 모두 해결하기 위한 방법으로는 투명액티비티를 호출하는 액티비티의 화면고정을 설정해주고 투명액티비티를 호출합니다. 여기서 중요한 점은 투명 액티비티에서는 화면고정에 대한 설정을 해서는 안됩니다.(manifes 혹은 activity 코드) 투명 액티비티에서 화면 고정을 설정해주면 당연히 targetSdk 27이상을 하는 8.0디바이스에서는 앱이 종료되겠죠?
이렇게 설정해주면 투명액티비티는 뒤에 남아있는 즉, 투명액티비티를 호출한 액티비티의 orientation 설정을 따라 화면 회전이 되지 않습니다. 이렇게 해줌으로써 가로 설정을 해야하는 부분과 8.0에서 화면전환 고정을 해야하는 해결방법을 알아 보았습니다.
감사합니다.
❤️
Love YourSelf
'Android' 카테고리의 다른 글
[시골책방] 앱 출시 !! (0) | 2020.08.17 |
---|---|
[Android] View에 대해서 알아보자 - ViewLifeCycle (0) | 2019.11.26 |
[Android] Mac에서 Android SDK Path 설정 및 무선 ADB 연결 (0) | 2019.11.17 |
[Android] Q Scoped Storage - MediaStore로 화면 스크린샷 저장하기 - Android Q (0) | 2019.10.29 |
[Android] MediaController dispatchKeyEvent not called (0) | 2019.10.22 |