一、什么是Android悬浮窗权限?
Android悬浮窗权限用于在应用中创建可悬浮于其他应用之上的窗口,让用户可以同时使用其他应用程序。
需要注意的是,自Android 8.0(API级别26)以后,悬浮窗权限被分类为“应用程序窗口”权限。应用程序窗口权限仅适用于那些在前台运行的应用程序。有关此更改的详细信息,请参见此处
二、如何获取Android悬浮窗权限?
1. 通过系统设置获取权限
用户可以通过系统设置来为特定的应用程序授予悬浮窗权限。
public static final int REQUEST_CODE = 1012; 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, REQUEST_CODE); } else { // 已经获取了悬浮窗权限,可以在此进行操作了 ... } }
上述代码首先检查设备的Android版本是否为6.0或更高版本,如果是,那么会检查特定应用程序是否已授予悬浮窗权限。如果应用程序没有权限,则会打开系统设置界面,让用户授权。在接下来的流程中,需要重写onActivityResult方法以判断用户是否已经授权。
2. 使用ACTION_MANAGE_OVERLAY_PERMISSION意图获取授权
除了通过系统设置来获取权限,还可以通过打开意图的方式来获取授权。
public static final int REQUEST_CODE = 1012; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); }
上述代码打开了ACTION_MANAGE_OVERLAY_PERMISSION意图,这个意图会启动一个活动,该活动允许用户授予特定应用程序悬浮窗权限。同样的,需要重写onActivityResult方法以判断用户是否已经授权。
三、悬浮窗权限的使用
1. 检查权限
一旦你已经获取了悬浮窗权限,接下来需要检查用户是否将该权限回收。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { // 用户已经回收了悬浮窗权限 ... } else { // 悬浮窗权限可用,执行相关操作 ... } }
2. 添加悬浮窗视图
在应用程序中显示悬浮窗具体实现可以使用WindowManager类或任何适当的第三方库。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { params.type = WindowManager.LayoutParams.TYPE_PHONE; } windowManager.addView(view, params);
上述代码中,params.type在Android O(API级别26)之后始终为WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。小于API 26的设备,则应使用WindowManager.LayoutParams.TYPE_PHONE类型,如上所示。
3. 删除悬浮窗视图
如果要删除悬浮窗视图,则应使用WindowManager.removeView方法。
windowManager.removeView(view);
四、总结
Android悬浮窗权限的使用需要获取权限和相应的使用。要获取权限,可以使用系统设置或ACTION_MANAGE_OVERLAY_PERMISSION意图,使用则需要检查权限、添加悬浮窗视图和删除悬浮窗视图。