항상 최상단에 위치하는 뷰 구현 시 문제가 발생한다.


1. '다른 앱 위에 그리기' 권한을 허용해 준다.


if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){

    Log.i("TEST", "Permission Granted ? " + Settings.canDrawOverlays(context));

    //M 이상에서만 퍼미션 확인(그 이하에서는 자동으로 허용됨)

//다른 앱 위에서 그리기 권한에 대한 허용 여부 체크

    if(Settings.canDrawOverlays(context)) {

    //이미 권한 설정 되어있음

        context.startService(new Intent(context, XXSerivce.class));

    }else{

        //권한 없음        

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

        context.startActivity(intent);    //startActivityForResult로 대체 가능

    }

}




2. 서비스에서 addView를 할 때 버전에 따라 Flag를 다르게 설정


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 mParams = new WindowManager.LayoutParams(

  가로 크기,

세로 크기,

LAYOUT_FLAG,

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,

PixelFormat.TRANSLUCENT);

mWindowManager.addView(표시할 뷰, mParams);




** 참고

https://stackoverflow.com/questions/46208897/android-permission-denied-for-window-type-2038-using-type-application-overlay

+ Recent posts