锁屏界面无法无法显示Toast

2024-09-06 09:08

本文主要是介绍锁屏界面无法无法显示Toast,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在锁屏界面开发几个快捷方式启动某些应用,例如:Calculator, Camera,Google voice和Call等,界面如下。且这种做法很普遍,很多厂商都有。


说明:

1>左边图片右下角为快速启动Calculator的快捷方式,在无需解锁的情况下,进入Calcaulator应用。

2>右边图片为从launcher中启动Calculator后,操作时弹出的Toast提示。

那么问题来了,当不解锁启动Calculator后,同操作无法显示Toast内容。


1.这里搜寻API,得到如下结果,本问题的核心也正在此。

/frameworks/base/core/java/android/view/WindowManager.java

        /** Window flag: special flag to let windows be shown when the screen* is locked. This will let application windows take precedence over* key guard or any other lock screens. Can be used with* {@link #FLAG_KEEP_SCREEN_ON} to turn screen on and display windows* directly before showing the key guard window.  Can be used with* {@link #FLAG_DISMISS_KEYGUARD} to automatically fully dismisss* non-secure keyguards.  This flag only applies to the top-most* full-screen window.*/public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
        /** In a multiuser system if this flag is set and the owner is a system process then this* window will appear on all user screens. This overrides the default behavior of window* types that normally only appear on the owning user's screen. Refer to each window type* to determine its default behavior.** {@hide} */public static final int PRIVATE_FLAG_SHOW_FOR_ALL_USERS = 0x00000010;

用法如下,为此也写了个demo来验证此问题:


2.但是Toast的getWindowParams方法带@hide的隐藏接口,非公开API,于是尝试使用反射方法获取。


3.但是随之而来的又一个问题,WindowManager.LayoutParams的privateFlags也为非公开API。

        /*** Control flags that are private to the platform.* @hide*/public int privateFlags;

4.针对隐藏属性API,似乎无计可施。想到这是一个预置的应用,若是拥有平台签名,即可随意访问public的非公共API。

此方案可以参考另外一片文档《Android APK获取平台系统签名权限》,此处不作详述。

5.作为Calculator,原本可以是一个很普通的应用,若单为了这个Toast去提升应用之权限,似乎有不妥。于是又找了另一个法子,通过Toast.java源码的阅读,发现:

=>在调用Toast.makeText()方法时,会取new Toast对象;


而Toast的构造方法中又New了一个TN对象


6.结果发现,TN构造方法中就已经开始对此类“窗口”进行flags初始化。


说明:

上图时进行修改后的方法,为了避免对所有默认无参构造生成的Toast产生影响,即增加一个“构造方法”,使之更为方便地为类似Calculator这种应用场景的Toast服务。


7.

最终解决效果,如果加上para.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;将还能在Lockscreen中显示,如果用户快速返回退至Lock。



这篇关于锁屏界面无法无法显示Toast的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141596

相关文章

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的