SYSTEM_ALERT_WINDOW-Android 6.0 및 targetSdkVersion 23에서이 권한을 자동으로 얻는 방법


82

Facebook, Evernote, Pocket-23 ( targetSdkVersion=23)을 대상으로하는 모든 앱은 Android 6.0에서이 권한을 자동으로 받습니다.

새로운 Marshmallow 권한 모델에 관한 문서가 많이 있습니다. 그중 하나는 SYSTEM_ALERT_WINDOW'위험 이상'권한 등급으로 '승급'되어 앱에 권한을 부여하기 위해 특별한 사용자 개입이 필요합니다. 앱이 targetSdkVersion22 이하인 경우 앱은이 권한을 자동으로 가져옵니다 (매니페스트에서 요청한 경우).

그러나 사용자에게 Draw over other apps권한 설정 특별 페이지를 보낼 필요없이이 권한을받는 일부 앱을 발견했습니다 . 저는 Facebook, Evernote, Pocket을 봤습니다.

누구든지 사용자가 통과하지 않고도 앱에이 권한을 부여 할 수있는 방법을 알고 Settings -> Apps -> Draw over other apps있습니까?

감사



stackoverflow.com/questions/33139754/... 이 게시물은 외부에 쓰기의 대화 권한을 보여주기 위해 나에게 도움이
바라 스

답변:


116

Marshmallow 6.0.1에 도입 된 새로운 동작 입니다.

SYSTEM_ALERT_WINDOW권한 을 요청 하고 Play 스토어를 통해 설치된 모든 앱 (버전 6.0.5 이상 필요)은 자동으로 권한을 부여합니다.

대신 앱이 사이드로드 된 경우 권한이 자동으로 부여되지 않습니다. apkmirror.com 에서 Evernote APK를 다운로드하고 설치할 수 있습니다 . 보시다시피에서 권한을 수동으로 부여해야합니다 Settings -> Apps -> Draw over other apps.

Play 스토어가 자동으로 권한을 부여하도록 허용 하는 커밋 [1] [2] 입니다 SYSTEM_ALERT_WINDOW.


6
왜 갑자기 '위기 이상'허가가 '정상 이하'인지 궁금합니다. 내 말은 팝업에서이 권한을 볼 수도없고 앱이 자동으로 가져올 수 있다는 뜻입니다. 이견있는 사람?
oriharel

권한은 above dangerous실제로 앱을 사이드로드해도 권한이 부여되지 않습니다. 동작이 다르고 자동으로 권한을 부여하는 것은 Play 스토어뿐입니다. Play 스토어의 앱이 악성이 아니며 신뢰할 수 있다고 생각했을 수도 있습니다. 또는이 변경 사항에 대해 많은 불만을 접수하고 해결 방법을 찾기로 결정했을 수도 있습니다.
Mattia Maestrini

2
@oriharel 페이스 북 메신저의 거대한 규모가이를 지원하기 위해 구글을이 방향으로 밀어 붙 였는지 궁금합니다. 페이스 북이 구글과의 거래를 성사 시켜서 사용자가 챗 헤드가 계속 작동 할 수 있도록 권한을 부여하도록 강요하지 않았을 수도 있습니다.
dennisdrew

3
이 권한을 자동 부여하는 동작에 대해 질문했을 때 (그 이유는 targetSdk라고 생각했습니다.) Google의 응답은 "이것은 인기있는 앱이 다른 API를 사용할 때까지 계속 작동 할 수 있도록하기위한 의도 된 동작입니다. 이러한 앱을 마이그레이션 할 수있는 플랫폼입니다. " . 게시물은 다음과 같습니다. code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
Android 개발자

1
@MattiaMaestrini이 비슷한 질문을 볼 수 있습니까? stackoverflow.com/questions/54378632/...

74

Yeh Marshmallow 이후 Android는 보안 수준을 더욱 강화합니다.

SYSTEM_ALERT_WINDOW

당신은 플로팅 액션과 모든 것을 보여줄 수 있습니다 당신은 당신의 onCreate()메소드 에서 코드를 따라 사용자에게 권한을 부여 할 수 있습니다.

    // Check if Android M or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // Show alert dialog to the user saying a separate permission is needed
        // Launch the settings activity if the user prefers
        Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        startActivity(myIntent);
    }

이 작업 ACTION_MANAGE_OVERLAY_PERMISSION은 '다른 앱 위에 그리기'권한 화면을 직접 시작합니다.


편집 : 위 코드가 100 % 올바르게 작동합니다.

하지만 난 그냥 많은 사람들이 아직도 방법을 허용 할 수 있음을 찾고 발견 ACTION_MANAGE_OVERLAY_PERMISSION 사용자가 할 수있는 경우 허가가되면 다음마다 그는 오픈 응용 프로그램 요구하지 않는 것처럼 영구적 정도 당신이 -에 대한 듣고 솔루션

  1. 기기에 API 23 이상이 있는지 확인

  2. 23+ API이면 사용자가 허가를 받았는지 확인하십시오.

  3. 한 번 허가를 받았다 Settings.ACTION_MANAGE_OVERLAY_PERMISSION면 그를 운전하지 않았고 아직 허가하지 않았다면 런타임 허가 확인을 요청하십시오.

귀하의 onCreate()방법에 아래 줄을 넣으십시오 . 이 뒤에 넣어setContentView

checkPermission();

이제 코드 아래에 넣으십시오. onActivityResult

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // You don't have permission
            checkPermission();
        } else {
            // Do as per your logic 
        }

    }

}

이제 마지막으로 checkPermission 메소드 코드

public void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
        }
    }
}

그리고 클래스에서이 공용 변수를 선언하는 것을 잊지 마십시오.

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

1
@JaymanJani 안녕하세요이 나를 위해 노력하지만 난 이벤트 오프 스위치 버튼을 원하는
PriyankaChauhan

onPermission은 어떻게해야합니까? 나는 응용 프로그램 열려
Santanu 수르

좋은 솔루션입니다. 그러나 checkPermission () 메서드에서 이미 확인 했으므로 onActivityResult 메서드에서 canDrawOverlays 권한을 다시 확인할 필요가 없습니다.
VahidShir

잘 작동하지만 이제 도구 모음 메뉴 항목을 탭할 수 없습니다. 할 수 있습니까?
Pablo R.

사람의 얼굴 문제가 주시기 바랍니다 이봐 나 감사를 알고
Jayman 야니

13

이제 ( 2019 ) Google이 Android Q에서 BubblesSYSTEM_ALERT_WINDOW 의 형태로 대체 API를 제공하므로 Google은 향후 Android 릴리스에서 결국 지원 중단하기로 결정했습니다 .SYSTEM_ALERT_WINDOW

그리고 안드로이드 이동 장치는 더 이상이 권한을 부여하지 않습니다Settings.canDrawOverlays() == false


이것을 어떻게 아십니까? 문서에는 아직 미리보기 중이라고 나와 있습니다. developer.android.com/guide/topics/ui/bubbles
노아 DRACH

True @NoaDrach, 이것이 내가 미래에 Google이 궁극적으로 SAW를 지원하지 않을 것이라고 말한 이유입니다. 즉, Bubble API가 안정적 일 때 말입니다. youtu.be/td3Kd7fOROw?t=136
개발자 Dickson

고마워요, 나는 b / c 내 앱 (아직 Q를 대상으로하지 않음)을 요청했습니다. -이의 그것의 B / C 추측 reddit.com/r/androiddev/comments/a69q0i/...를
노아 DRACH를

@Dicksonthedeveloper SYSTEM_ALERT_WINDOW 또는 화면 오버레이 권한의 기능이없는 장치를 식별하는 방법을 알려주십시오.이 stackoverflow.com/questions/63938787/…의
Shaikh Mohib

Android 11에는이 API가 포함되어 있습니다.
NothingtoSay

9

매니페스트의 SYSTEM_ALERT_WINDOW 외에 Play 스토어에서 앱을 다운로드 할 때 자동으로이 권한을 받으려면 이 링크 로 이동하여 Google에 요청 해야합니다 .

이 권한이 필요한 이유에 대한 추가 정보를 제공해야하며 Google에서 검토하여 자동으로 권한을 부여합니다.

이를 요청하기 전에 다음을 수행해야합니다.

  • 매니페스트에 SYSTEM_ALERT_WINDOW 권한이 있습니다.

  • 아직 부여되지 않은 경우 사용자에게 앱 내에서 SYSTEM_ALERT_WINDOW 권한을 부여하라는 메시지를 표시합니다.

내가 뭔가를 놓친 경우 언제든지 답변을 업데이트하십시오.


이것은 지금 정답 일 것입니다. 감사합니다. 프로그래밍 방식으로 사용자에게이 권한을 요청하는 방법에 대한 답변을 추가해주세요.
Eren Tüfekçi

2

앱이 API 22 이하를 타겟팅하는 경우 기기가 Android 6.0 인 경우에도 사용자가 클릭하여 설치 (경고 표시) 할 때 Play 스토어에서 SYSTEM_ALERT_WINDOW 권한 및 기타 권한을 부여합니다. 그렇지 않으면 앱이 API 23 이상을 타겟팅하면 권한은 런타임에 부여하도록 요청됩니다.


업데이트 된 Play 스토어 정책 (2018 년 8 월 이후)에 따라 SDK 26 미만을 타겟팅해서는 안됩니다.이 참조 링크를 참조하십시오. 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.