수색…


팝업 오버레이

모든 응용 프로그램의 상단에보기를 배치하려면 해당 창 관리자에보기를 지정해야합니다. 이를 위해 시스템 경고 권한이 필요합니다.이 경고는 매니페스트 파일에 다음 행을 추가하여 요청할 수 있습니다.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

참고 : 응용 프로그램이 손상되면보기가 창 관리자에서 제거됩니다. 따라서보기를 작성한 후 전경 서비스로 창 관리자에 할당하는 것이 좋습니다.

WindowManager에 뷰 할당하기

다음과 같이 창 관리자 인스턴스를 검색 할 수 있습니다.

WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

뷰의 위치를 ​​정의하려면 다음과 같이 몇 가지 레이아웃 매개 변수를 만들어야합니다.

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
        PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;

이제 다음과 같이 생성 된 레이아웃 매개 변수와 함께 뷰를 윈도우 관리자 인스턴스에 할당 할 수 있습니다.

mWindowManager.addView(yourView, mLayoutParams);

빌라! 보기가 다른 모든 응용 프로그램 위에 성공적으로 배치되었습니다.

참고 : 보기는 키 가드 위에 놓이지 않습니다.

부여 SYSTEM_ALERT_WINDOW 안드로이드 6.0 이상에 대한 권한

android 6.0에서이 권한은 동적으로 부여해야합니다.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

권한 아래 던진 경우 6.0에서 오류가 거부되었습니다.

Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type

해결책 :-

아래와 같이 오버레이 권한을 요청하면,

if(!Settings.canDrawOverlays(this)){
    // ask for setting 
     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
     Uri.parse("package:" + getPackageName()));
     startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}

결과를 확인하고,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_OVERLAY_PERMISSION) {
        if (Settings.canDrawOverlays(this)) {
            // permission granted...
        }else{
            // permission not granted...
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow