[Android] 다른 앱 위에 그리기 샘플코드(android.permission.SYSTEM_ALERT_WINDOW)
다른 앱 위에 팝업창을 뛰우거나 앱을 실행해야할 때 다른 앱 위에 그리기 권한이 필요하다.
일반 권한 및 위험 권한처럼 동작하지 않는 권한이 있다. SYSTEM_ALERT_WINDOW 및 WRITE_SETTINGS는 특히 민감하므로 대부분의 앱에서 사용하면 안 된다. 앱에 이러한 권한 중 하나가 필요하면 매니페스트에서 이 권한을 선언하고 사용자 승인을 요청하는 인텐트를 전송해야 한다. 시스템은 사용자에게 세부 관리 화면을 표시하여 인텐트에 응답한다.
Android 시스템에서 제공하는 모든 권한은 Manifest.permission에서 확인할 수 있습니다.
우선 AndroidManifest.xml 파일에 권한을 추가한다.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
다음은 사용자가 직접 설정할 수 있도록 다른 앱 위에 그리기 권한 설정창을 호출해야한다.
ToggleButton toggleDraw = findViewById(R.id.toggle_draw);
toggleDraw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//마시멜로우 권한 처리
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
}
}
});
안드로이드 10 ( API 29) 까지는 직접 패키지명으로 다른앱 위에 그리기 허용 설정 창을 호출 할 수 있다. 하지만 안드로이드 11 (API 30) 부터는 Uri.parse(“package: getPackageName()));” 는 무시된다. 적용되지않으며, 사용자가 직접 설정창에서 앱을 찾아서 허용해야한다.
다음은 백그라운드 서비스에서 내가 원하는 팝업창이나 액티비티를 호출한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//마시멜로우 버전 권한 처리
if (Settings.canDrawOverlays(context)) { //다른앱 위에 그리기 권한이 있을 때
Intent sIntent = new Intent(context, MainActivity.class);
sIntent.putExtra("action", "tts");
//같은창 여러번 띄우지 않고 기존창 띄운다.
sIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Activity가 아닌 곳에서 startActivity를 사용하려고 할때
sIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(sIntent);
}
}
[주의사항]
구글플레이에 앱을 등록할 경우 주의가 필요하다. 만약 구글플레이에 등록한 앱에 광고를 노출하고 있다면
광고 정책 위반으로 거부되거나 어느날 갑자기 삭제될 수 있다.
[관련]
Android 11의 권한 업데이트 : 시스템 알림 창 변경사항