Android-悬浮窗口

在Android系统中,如果应用需要弹出一个悬浮窗口,就需要申请一项特殊权限

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

在Android O之前的系统中申请了该权限后,再给对应的window设置

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_PHONE;

悬浮窗口就可以显示出来。

但是在Android O的系统中,google规定申请

android.permission.SYSTEM_ALERT_WINDOW
权限的应用需要给悬浮窗口设置如下type:

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

悬浮窗口才能显示出来,“TYPE_APPLICATION_OVERLAY”是重点。
如果不设置该TYPE,应用会Crash,报错如下(后面的2002表示设置的type为TYPE_PHONE):

AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@c8d1f1a -- permission denied for window type 2002

另外说一下:申请
android.permission.SYSTEM_ALERT_WINDOW
权限不能使用 requestPermissions 方法。
可以使用下面的方法:

Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 100);

完整代码

1、添加权限

在AndroidManifest.xml中添加悬浮窗所需的权限:

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

2、请求权限(针对Android 6.0及以上)

  • 对于Android 6.0(API级别23)及以上的设备,需要运行时请求SYSTEM_ALERT_WINDOW权限。示例:
private static final int REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION = 200;// 在Activity或Fragment中请求权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION);
}
  • 处理权限请求的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {// 权限被拒绝Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();} else {// 权限已授予,可以显示悬浮窗showFloatingWindow();}}
}

3、实现悬浮窗

  • 定义悬浮窗的布局和显示逻辑:
public void showFloatingWindow() {// 布局参数WindowManager.LayoutParams params;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);} else {params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);}// 设置悬浮窗的位置params.gravity = Gravity.TOP | Gravity.START; // 例如,设置在屏幕左上角params.x = 100; // x坐标params.y = 100; // y坐标// 创建浮动窗口视图LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);View floatingView = inflater.inflate(R.layout.floating_window_layout, null);// 获取WindowManagerWindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);try {// 添加悬浮窗到WindowManagerwindowManager.addView(floatingView, params);} catch (Exception e) {e.printStackTrace();}
}
  • 关闭浮窗
public void removeFloatingWindow() {// 获取WindowManager实例WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);// 确保floatingView是之前添加到WindowManager的那个View实例// 这里假设floatingView是在showFloatingWindow()方法中创建并添加的View floatingView = ...; // 你需要确保这指向正确的View实例if (floatingView != null && windowManager != null) {// 移除悬浮窗视图windowManager.removeView(floatingView);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

郭子威:未来香港楼市多方拉动稳健前行

今年2月&#xff0c;香港取消了实行14年的楼市“辣招”。“撤辣”之后&#xff0c;香港楼市迎来迅速反弹&#xff0c;3月一手房成交量环比涨逾10倍。 香港“撤辣”的背景是什么&#xff1f;撤辣之后对楼市的长远影响有哪些&#xff1f;未来香港楼市的表现将会如何&#xff1f; …

马蹄集 oj赛(双周赛第二十九次)

目录 供水管线 附庸的附庸 逆序 队列安排 管理通讯簿 调整队伍 泡泡 一元多项式的加法 约瑟夫环 暧昧团 快排变形 采蜜 供水管线 难度:钻石● 时间限制:1秒巴: 占用内存:128 M 在几个城市之间原本要规划修建许多条下水管道&#xff0c;管理人员发现这些管道会形成一…

KubeCon 香港:移动云与云猿生联合议题《在没有专用 Operator 的情况下管理数据库集群》

KubeCon CloudNativeCon 开源峰会 AI_dev 中国大会将于 2024 年 8 月 21 日至 23 日在香港举行。来自全球的云原生技术专家与爱好者在这里相会&#xff0c;探讨云原生领域的技术创新与最佳实践。此外&#xff0c;本次 KubeCon CloudNativeCon 和开源峰会将与 AI_dev&#x…

前端特殊字符数据,后端接收产生错乱,前后端都需要处理

前端&#xff1a; const data {createTime: "2024-06-11 09:58:59",id: "1800346960914579456",merchantId: "1793930010750218240",mode: "DEPOSIT",channelCode: "if(amount > 50){iugu2pay;} else if(amount < 10){iu…

【日常记录】【JS】SSE 流式传输 ChatGPT 的网络传输模式

文章目录 1、SSE 流式传输2、后端代码3、前端代码5、SSE和WS 对比6、chatgpt SSE的服务端返回的数据参考链接 单工通信是一种单向的通信方式&#xff0c;其中信息只能从发送端传输到接收端&#xff0c;而接收端不能向发送端发送任何信息。在Web开发中&#xff0c;Server-Sent E…

Unity把日志打印到屏幕上

在Unity中&#xff0c;如果你想要在屏幕上直接显示日志信息&#xff0c;而不仅仅是在控制台输出&#xff0c;你可以使用Unity的GUI系统来实现。下面是一个简单的示例&#xff0c;展示如何在Unity游戏中实时显示日志信息。 1、创建一个新的C#脚本&#xff1a; 在Unity编辑器中…

Elasticsearch 分析查询性能

一、引言 Elasticsearch作为一个分布式、多节点的搜索引擎和分析工具&#xff0c;提供了实时、可扩展、高性能的搜索和分析功能。然而&#xff0c;随着数据量的不断增长和查询复杂性的增加&#xff0c;如何分析和优化Elasticsearch的查询性能成为了一个重要的问题。本文将介绍…

计算机等级考试-Java考试大纲

二级Java语言程序设计考试大纲 【基本要求】 &#xff11;&#xff0e;掌握 &#xff2a;&#xff41;&#xff56;&#xff41; 语言的特点、实现机制和体系结构。 &#xff12;&#xff0e;掌握 &#xff2a;&#xff41;&#xff56;&#xff41; 语言中面向对象的特性。…

CP AUTOSAR标准之IPDUMultiplexer(AUTOSAR_CP_SWS_IPDUMultiplexer)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块I-PDU多路复用器IpduM的功能、API和配置。   PDU复用是指使用PDU(协议数据单元)的相同PCI(协议控制信息)和其SDU(服务数据单元)的多个唯一布局。选择器字段是复用PDU的SDU的一部分。它用于区分复用PDU的内容。   目前,人…

Zabbix对接Elasticsearch(ES)数据库(未成功)

0.需求分析 不管zabbix的后端数据库是oracle还是mysql&#xff0c;当zabbix监控的量级达到了一定程度后&#xff0c;那么对数据库的性能是一个非常严峻的挑战。特别是对历史数据的查询&#xff0c;将会变得非常非常的慢&#xff0c;别告诉我可以建索引优化&#xff0c;当量级达…

图解ReentrantLock的基石AQS-独占锁的获取与释放

大家好&#xff0c;我是呼噜噜&#xff0c;我们之前聊过Java中以互斥同步的方式保证线程安全&#xff1a;Sychronized&#xff0c;这次我们来再聊聊另一种互斥同步的方式Lock&#xff0c;本文会介绍ReentrantLock及其它的基石AQS的源码解析&#xff0c;一个非常重要的同步框架 …

驾驭巨龙:Perl中大型文本文件的处理艺术

驾驭巨龙&#xff1a;Perl中大型文本文件的处理艺术 Perl&#xff0c;这门被亲切称为“实用提取和报告语言”的编程语言&#xff0c;自从诞生之日起&#xff0c;就以其卓越的文本处理能力闻名于世。在面对庞大的文本文件时&#xff0c;Perl的强大功能更是得到了充分的体现。本…

【数据结构与算法】哈希表 详解

开放定址哈希表的存储结构是什么样的&#xff1f; 开放定址哈希表的存储结构&#xff1a; #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1int hashsize[] {997, /*...*/}; // 哈希表容量递增表&#xff0c;一个合适的素数序列typedef struct {ElemType *elem;…

案例分享丨全球金融科技独角兽利用悦数图数据库保障金融交易安全

项目背景 这家成立于 2015 年的全球金融科技独角兽公司&#xff0c;为全球超过 10 万家企业提供金融服务接口&#xff0c;支持国际交易和资金转账。该平台可以支持近 180 个国家的本地收款服务&#xff0c;并能够向超过 150 个国家付款。截至 2024 年 1 月&#xff0c;该平台的…

洛谷 AT_arc171_a [ARC171A] No Attacking 题解

分析 显然&#xff0c;在一个 N N N\times N NN 的网格里&#xff0c;如果要放超过 N N N 个车&#xff0c;那么是肯定无法完成的。 很明显&#xff0c;车放都在偶数行是最优的&#xff0c;如果不够了就放在奇数行&#xff0c;然后再把所有的兵都放在奇数行。 还可以知道…

Jetpack - Navigation: 一个全面的安卓开发指南

引言 导航是任何安卓应用程序中至关重要的部分。无缝地在不同的屏幕之间移动并传递数据&#xff0c;对于流畅的用户体验来说至关重要。在这篇博客中&#xff0c;我们将深入探讨Jetpack的Navigation组件&#xff0c;这个强大的框架旨在简化安卓应用中的导航。我们将涵盖从设置和…

ABAP开发:动态Open SQL编程案例介绍

动态Open SQL是Open SQL的扩展。它不是要求整个SQL语句都是动态指定的。通过熟悉的静态ABAP编码表达静态已知的部分&#xff0c;动态元素的部分通过动态标记指定。动态片段不明确包含在ABAP源代码中&#xff0c;而是源代码包含一个ABAP变量&#xff0c;用括号括起来作为占位符。…

CSS的媒体查询:响应式布局的利器

关于CSS的媒体查询 CSS媒体查询是CSS层叠样式表(Cascading Style Sheets)中的一个核心功能&#xff0c;它使得开发者能够根据不同的设备特性和环境条件来应用不同的样式规则。这是实现响应式网页设计的关键技术&#xff0c;确保网站或应用能够在多种设备上&#xff0c;包括桌面…

YOLOV8图像分割预测后输出mask图

训练一个yolov8后&#xff0c;用官方的预测脚本一般是&#xff1a; results model.predict(img_path, saveTrue, save_diroutput_folder) 运行此代码会直接在run里面生成一个文件夹&#xff0c;保存预测图像。如果要获取分割后的mask点&#xff0c;或mask的轮廓点&#xff0…

nacos使用shared-configs设置多个配置文件后,配置中修改无法动态更新 解决办法

问题描述 今天使用nacos去做配置分离&#xff0c;启动成功了&#xff0c;配置也读取了&#xff0c;但是当我修改nacos中的配置时&#xff0c;发现数据无法动态更新 下面是测试接口的调用 可以看到我修改配置后&#xff0c;接口返回的参数依然是老参数 问题排查 首先检查了…