Android M에서 SYSTEM_ALERT_WINDOW 권한을 신청할 수 없는 문제에 대한 해결 방법

최근 저는 Android 5.0 이상의 다양한 버전을 포괄하는 각 기기의 보조 화면 표시 기능을 조정해야 하는 프로젝트를 진행하고 있었습니다. Android 보조 화면 기능에 대해 자세히 알아보려면 다음 문서를 참조하세요.

Android프레젠테이션

간단히 말해서, 안드로이드에서 보조 화면을 사용하려면 Presentation 클래스 를 사용해야 하는데 , 보조 화면이 전역적으로 표시되도록 하려면 먼저 전달되는 컨텍스트 개체 Context 가 Application 또는 Service 에서 올 수 있으며 SYSTEM_ALERT_WINDOW 권한을 추가로 활성화해야 합니다. .

Android 6.0 이상에서는 권한을 얻기 위해 동적 애플리케이션이 필요하므로 SYSTEM_ALERT_WINDOW 는 특별하며 ActivityCompat.requestPermissions 코드를 통해 직접 적용 할 수 없습니다. 그런 다음 사용자에게 인증을 요청하는 설정 페이지로 간접적으로 안내해야 합니다.
애플리케이션의 상위 레이어에 표시되는 설정 인터페이스
참조 코드는 다음과 같습니다.

//参考自http://stackoverflow.com/questions/32061934/permission-from-manifest-doesnt-work-in-android-6
public static int OVERLAY_PERMISSION_REQ_CODE = 1234;

@TargetApi(Build.VERSION_CODES.M)
public void requestDrawOverLays() {
    
    
    if (!Settings.canDrawOverlays(MainActivity.this)) {
    
    
        Toast.makeText(this, "您还没有打开悬浮窗权限", Toast.LENGTH_SHORT).show();
        //跳转到相应软件的设置页面
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + MainActivity.this.getPackageName()));
        startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
    } else {
    
    
      // 授权成功之后执行的方法
      ...
    }
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
    
    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
    
    
        if (!Settings.canDrawOverlays(this)) {
    
    
            Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
        } else {
    
    
            Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
        }
    }
}

추천

출처blog.csdn.net/liuzhuo13396/article/details/120040459