투케이2K

903. (Android/Java) [간단 소스] windowManager addView 윈도우 매니저 사용해 뷰 전체 화면 추가 방법 본문

Android

903. (Android/Java) [간단 소스] windowManager addView 윈도우 매니저 사용해 뷰 전체 화면 추가 방법

투케이2K 2024. 11. 20. 19:48

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java

- 개발 툴 : Android Studio

- 구분 : 간단 소스

- 사전 설정 필요 : 

   >> windowManager addView 를 사용해 새로운 뷰를 추가하기 위해서는 Settings.canDrawOverlays 권한 부여 체크 필요

   >> Settings.canDrawOverlays 권한이 부여 되지 않은 경우 ACTION_MANAGE_OVERLAY_PERMISSION 권한 부여 필요 
      : ex - Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// [사전 API 레벨 체크 및 퍼미션 권한 부여]
if (Build.VERSION.SDK_INT >= 23) {

    if (!Settings.canDrawOverlays(A_Webview.this)) { // [앱 위에 표시 : 권한이 부여 되지 않음]
        S_Log._E_("WebChromeClient :: Permission Not Grant", null);

        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        startActivity(intent);

        return;
    }
    
}



// [비디오 태그 재생 화면 전체 화면 전환] : [mCustomView 뷰 할당]
View mCustomView = view;
mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); // [시스템 UI 표시 설정]



// [WindowManager 생성 뷰 최상단 표시 설정]
try {
    WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, // 프레임 최대 크기
            WindowManager.LayoutParams.MATCH_PARENT, // 프레임 최대 크기
            LAYOUT_FLAG, // API 레벨에 따라 TYPE_SYSTEM_ALERT 등을 사용 필요
            //WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 터치 불가능 / 윈도우가 포커스를 가져오지 않도록 설정
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 터치 가능 / 윈도우가 포커스를 가져오지 않도록 설정
            PixelFormat.TRANSLUCENT);

    // [윈도우 초기 위치 설정]
    params.gravity = Gravity.START | Gravity.TOP;
    params.x = 0;
    params.y = 100;

    // [윈도우 뷰 추가]
    windowManager.addView(mCustomView, params);
}
catch (Exception e){
    e.printStackTrace();
}

// --------------------------------------------------------------------------------------

 

반응형
Comments