Android悬浮窗不用动态申请权限方法

发布时间:2021-11-12 16:54:11 作者:柒染
来源:亿速云 阅读:556

Android悬浮窗不用动态申请权限方法

在Android开发中,悬浮窗(Floating Window)是一种常见的UI组件,通常用于显示一些全局的、可拖动的窗口,例如悬浮球、悬浮按钮等。然而,从Android 6.0(API 23)开始,系统引入了动态权限申请机制,悬浮窗权限(SYSTEM_ALERT_WINDOW)被归类为危险权限,开发者需要在运行时动态申请该权限。这给开发者带来了一定的麻烦,尤其是在一些特殊场景下,用户可能不愿意授予悬浮窗权限。

本文将介绍一种在Android中实现悬浮窗功能而不需要动态申请权限的方法。这种方法适用于一些特定的场景,例如系统应用、预装应用或通过特殊渠道分发的应用。

1. 使用TYPE_APPLICATION_OVERLAY代替TYPE_SYSTEM_ALERT

在Android 8.0(API 26)及以上版本中,Google引入了TYPE_APPLICATION_OVERLAY窗口类型,用于替代TYPE_SYSTEM_ALERTTYPE_APPLICATION_OVERLAY窗口类型不需要申请SYSTEM_ALERT_WINDOW权限,但需要满足以下条件:

虽然这种方法仍然需要用户手动开启权限,但它避免了在代码中动态申请权限的复杂性。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT
    );
    // 添加悬浮窗
    windowManager.addView(floatingView, params);
}

2. 使用TYPE_TOAST窗口类型

在Android 7.1(API 25)及以下版本中,TYPE_TOAST窗口类型不需要任何权限即可显示悬浮窗。TYPE_TOAST窗口类型原本用于显示Toast消息,但开发者可以利用它来实现悬浮窗功能。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_TOAST,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT
    );
    // 添加悬浮窗
    windowManager.addView(floatingView, params);
}

需要注意的是,从Android 7.1.1(API 25)开始,TYPE_TOAST窗口类型的行为发生了变化,开发者无法再通过WindowManager直接添加TYPE_TOAST窗口。因此,这种方法仅适用于Android 7.1及以下版本。

3. 使用系统签名应用

对于系统应用或预装应用,开发者可以通过在应用的AndroidManifest.xml文件中声明SYSTEM_ALERT_WINDOW权限,并使用系统签名来绕过动态权限申请。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

系统签名应用在安装时会自动获得SYSTEM_ALERT_WINDOW权限,无需用户手动授权。这种方法适用于系统级别的应用,例如定制ROM中的系统工具或预装应用。

4. 使用无障碍服务(Accessibility Service)

无障碍服务(Accessibility Service)是一种特殊的系统服务,允许应用在后台监听用户的操作并执行一些自动化任务。通过无障碍服务,开发者可以实现悬浮窗功能,而无需申请SYSTEM_ALERT_WINDOW权限。

public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onServiceConnected() {
        // 创建悬浮窗
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_view, null);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        );
        windowManager.addView(floatingView, params);
    }
}

需要注意的是,无障碍服务需要用户手动开启,并且用户可能会对无障碍服务的滥用产生反感。

5. 总结

在Android中实现悬浮窗功能而不需要动态申请权限的方法有多种,开发者可以根据具体的应用场景选择合适的方法。对于普通应用,推荐使用TYPE_APPLICATION_OVERLAY窗口类型,并通过引导用户手动开启悬浮窗权限。对于系统应用或预装应用,可以使用系统签名来绕过动态权限申请。对于特殊场景,无障碍服务也是一种可行的解决方案。

无论选择哪种方法,开发者都应确保应用的悬浮窗功能不会对用户造成困扰,并遵守Android系统的权限管理规范。

推荐阅读:
  1. 关于Android的app权限申请问题
  2. Android6.0到底有什么不一样(动态权限申请)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android

上一篇:Main方法的执行过程是怎样的

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》