Android

[Android] 다른 앱 위에 그리기 샘플코드(android.permission.SYSTEM_ALERT_WINDOW)

다른 앱 위에 팝업창을 뛰우거나 앱을 실행해야할 때 다른 앱 위에 그리기 권한이 필요하다.

일반 권한 및 위험 권한처럼 동작하지 않는 권한이 있다. SYSTEM_ALERT_WINDOWWRITE_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의 권한 업데이트 : 시스템 알림 창 변경사항

 

특별권한

SYSTEM_ALERT_WINDOW

 

 

Leave a Reply

error: Content is protected !!