본문 바로가기
My Image
프로그래밍/Android

[Android] status bar hide 및 막는 방법

by Lim-Ky 2017. 5. 31.
반응형

안드로이드를 개발하다보면, 시스템 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);


반응형

댓글