혼자 앱 여러 개를 만들고 있는 개발자입니다.
휴대폰으로 긴 글을 읽을 때 줄을 자꾸 놓쳐서, 종이책 읽을 때 자를 대고 읽는 것처럼
화면 위에 띠를 띄우는 앱을 만들었습니다. 지금은 사용자분들 의견을 받아 계속 고치고 있습니다.




만들면서 고민했던 것들:
1) 접근성 서비스를 쓰지 않기
이런 류의 앱은 접근성 서비스로 만들면 편하지만, 사용자 입장에서 "화면을 다 읽을 수 있는 권한"은 부담스럽습니다.
그래서 SYSTEM_ALERT_WINDOW(다른 앱 위에 표시) 하나로만 띠·마스크·조작 버튼을 그립니다.
2) 마스크 모드는 창 두 개
위·아래 어두운 창 두 개 사이의 틈이 읽는 영역입니다. 노치(컷아웃) 있는 기기에서 위쪽 창이 컷아웃 높이만큼 밀려
틈이 좁아지는 버그가 있었는데, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS 로 해결했습니다.
화면 회전 때 옛 화면 크기로 마스크가 남던 문제도 onConfigurationChanged 에서 다시 계산하게 고쳤습니다.
3) 무료 / 유료 선
무료로 두 모드 다 쓰게 하고, 세션 60분 제한 + 광고. 광고를 한 번 보면 유료 기능 하나를 24시간 풀어 줍니다.
정말 필요한 사람이 결제 없이도 쓸 수 있게 하려고 이렇게 나눴습니다.
4) Windows 판
노트북으로 논문·강의자료를 읽을 때도 쓰려고 Windows 판도 만들었습니다(광고 없음).
Windows: https://apps.microsoft.com/detail/9NMSHKKX3R5C?cid=community-clien-dev
비슷한 오버레이 앱 만들어 보신 분들, 배터리·권한 안내 화면이나 제조사별 이슈에서 겪으신 경험 있으면 나눠 주세요.
안드로이드 12부터는 다른 앱 위에 뜬 창을 통과하는 터치를 막는데, TYPE_APPLICATION_OVERLAY 는 신뢰하는 창으로 치지 않아서 남는 예외가 투명도뿐입니다. 겹쳐 있는 오버레이 창들의 합친 불투명도가 기본값 0.8 이하일 때만 아래 앱으로 터치가 넘어간다고 되어 있습니다. 마스크 모드의 어두운 창이 그보다 진하면 어두운 영역 위에서 스크롤하거나 누를 때 아래 앱이 반응하지 않을 수 있습니다.
권한 안내 화면은 안드로이드 11부터 ACTION_MANAGE_OVERLAY_PERMISSION 인텐트에 package 를 넣어도 무시되고, 항상 설정의 전체 목록 화면으로 간다고 되어 있습니다. 그래서 목록에서 앱 이름을 찾아 켜라는 한 줄이 안내에 있으면 덜 헤맵니다.
마스크의 어두운 부분은 터치를 아래 앱으로 넘기게 두셨나요, 아니면 막는 쪽으로 두셨나요?
나중에 마스크를 더 어둡게 하는 설정을 넣으신다면, InputManager 의 getMaximumObscuringOpacityForTouch() 로 그 기기가 허용하는 최대값을 읽어서 그 아래로 묶어 두시면 좋을 것 같습니다. 0.8은 기본값이라 기기마다 다를 수 있다고 문서에 적혀 있어서요.