반응형
안드로이드를 개발하다보면, 시스템 OS단에서 기본적으로 제공해주는 이벤트나 서비스를 막아야 할 때가 온다.
나같은 경우에는 사용자가 내가만든 앱 이외에 어떤 화면도 보여지지 않고, 다른곳으로 갈 수 없도록 막아야 했다.
기본적으로 내가 개발한 앱단에서 백버튼,홈버튼,최근사용한앱 즉 하단 네비게이션 바 같은 경우에는 개발자 영역 수준에서 다른곳으로
Redirect 할 수 없도록 막는 것은 그리 어려운 작업은 아니다. 그러나기본적으로 제공하는 Status bar 에 대한 사용자 이벤트 처리는 앱개발
영역에서 막기가 어렵다... status bar의 색상이나 hide 숨기는 정도만 수정가능 한 것 같다.
하지만 나의 목적은 status bar를 hide하는 정도가 아니라 아예 기능자체를 사용자에게 제공하고싶지 않은 것이다
그래서 어쩔 수 없이 약간의 꼼수를 썼는데....
컨셉은 대략 이렇다.
우선 사용자가 화면상 status bar 이벤트 영역이 먹히는 x,y 터치좌표의 터치이벤트를 오버라이딩해서 인터셉터하고
그 안에 status bar 를 실시간으로 닫아주면, 왠만해서 사용자가 status bar를 사용할 수 없게 할 수 있다.
매니패스트에다 다음을 추가
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
액티비에서 터치이벤트 오버라이딩
@Override
public boolean onTouchEvent(MotionEvent event) {
int X = (int) event.getX();
int Y = (int) event.getY();
int eventaction = event.getAction();
if(Y < 400) {
onWindowFocusChanged(true);
// Toast.makeText(this, "ACTION_DOWN AT COORDS " + "X: " + X + " Y: " + Y, Toast.LENGTH_SHORT).show();
}
return true;
}
시스템 다이얼로그 닫기 로직 추가
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.d("Focus debug", "Focus changed !");
if(!hasFocus) {
Log.d("Focus debug", "Lost focus !");
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
sendBroadcast(closeDialog);
}
}
기본적으로 status bar는 hide를 하기 위해 아래와 같은 코드 onCreate 함수 안에 추가.
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
반응형
'프로그래밍 > Android' 카테고리의 다른 글
[Android] 비디오뷰 에러시 예외처리 (0) | 2017.06.02 |
---|---|
[Android] 앱 자동 실행과 종료 효과 내기 (0) | 2017.05.31 |
[Android] Build시 Java Heap size 부족 해결방법 (0) | 2017.05.24 |
[Android] 화면에 계속 앱 띄우는 방법 (2) | 2017.05.22 |
[Android] Android Gradle 버전별 Build Setting 정리 (0) | 2017.05.19 |
댓글