brunch

You can make anything
by writing

C.S.Lewis

by Noah Dec 07. 2015

안드로이드 마쉬멜로우 권한 #1

android.permission.SYSTEM_ALERT_WINDOW

며칠 전 브런치 앱이 죽었다는 리포트를 받았다.


죽은 부분은 첫 화면의 사이드바.

두둥. 왜 죽었을까?  추적추적

API 23 의 권한 설정 문제였다.

정확히는 Window Manager 권한 문제


문제가 발생하는 퍼미션은 다음과 같다.

윈도 창.

쓰기.

카메라.

등...


자 문제를 알았으니 하나씩 고쳐가 보자.

재현 방법

API 23 이상 단말에서 다른 앱 위에 그릴 수 있는 앱에서 브런치를 끈다. (그러지 맙시다.)

해결 방법

1. 권한을 켜게 만든다.

2. 권한이 계속 없으면 사용하지 못하게 해야 한다. 


권한 확인 방법

Setting.canDrawOverlays 함수를 호출한다.

어디 어디서 써야 할지 모르니 일단  static으로 하나 만들어 보자.

조건문에서 볼 수 있듯이 M 이상에서만 체크가 필요한 코드다. 

그 이하의  SDK에서는 설치할 때  확인받으면 계속 사용되는 것이다.


권한을 켜기 동작 확인

일단. 앱이 구동될 때 권한을 확인하고. 다른 앱 그리기를 설정할 수 있도록 팝업을 띄운다.

yes -> 설정하러 가기

no -> 앱 종료.

권한을 켜는 Activity 호출


여기서 켜고 돌아오면 정상 동작, 켜지 않고 back 했을 경우는 앱을 종료 처리한다.

그래도 권한 없을 수 있으니 try / catch

권한을 체크하는 곳이 한정적이다. 

onResume에서 매번 체크하는 건 좋은 방법 같지 않다. 사용자가 악의적으로 앱을 켜 놓고 나가서 지우고 온다면?! 문제가 발생할 수 있다.

그래서 해당 코드 호출 부위는 try / catch 한다.

앱 사용의 문제는 없지만 정상 동작은 하지 않을 것이다.

이건 사용자 탓.


마지막으로 본 적은 없지만 좋은 팁들을 공유해주시는 wilson.a 에게 감사의 마음을 전합니다.

매거진의 이전글 Brunch Android Shared element
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari