最近在做一个项目中需要适配各个机器的副屏显示功能,其中涵盖了安卓5.0以上的各个版本。其中想多了解关于安卓副屏功能的可以参考这篇文章:
简单的说在安卓中使用副屏需要用到 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();
}
}
}