0%

安卓8.0以上创建悬浮窗

问题

代码在8.0以下系统可正常创建悬浮窗,8.0以上则创建不了。原因是悬浮窗样式需要重新设置。

解决方案

增加SDK判断代码

1
2
3
4
5
6
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wmParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY;
}
else{
wmParams.type = LayoutParams.TYPE_PHONE;
}

判断是否拥有悬浮窗权限并申请

安卓6.0(代号M,SDK 23)之后,需要动态申请权限,悬浮窗权限也不例外。所以可以在添加以下代码来申请悬浮窗权限。
PS:当然,必须在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

1
2
3
4
5
6
7
8
if (Build.VERSION.SDK_INT >= 23)
{
if (!Settings.canDrawOverlays(activity))
{
Intent it = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
activity.startActivityForResult(it, 1);
}
}
1
2
3
4
5
6
7
8
9
10
11
@TargetApi(23) protected void onActivityResult(int reqCode, int resCode, Intent data)
{
if (!Settings.canDrawOverlays(this))
{
Toast.makeText(this, "未授予悬浮窗权限!", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(this, "悬浮窗权限授予成功!", Toast.LENGTH_SHORT).show();
}
}