关于在安卓M上无法申请 SYSTEM_ALERT_WINDOW 权限的解决方案

最近在做一个项目中需要适配各个机器的副屏显示功能,其中涵盖了安卓5.0以上的各个版本。其中想多了解关于安卓副屏功能的可以参考这篇文章:

安卓Presentation

简单的说在安卓中使用副屏需要用到 Presentation 这个类,而要想保证副屏全局都能显示,首先传递的上下文对象 Context 可以是来自 Application 或者 Service ,并且还需要额外开启 SYSTEM_ALERT_WINDOW 权限。

由于安卓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