在安全的 Android 锁屏中使用 FLAG_SHOW_WHEN_LOCKED 和 disableKeyguard()

2024-01-09

上下文

最近,我一直在寻找可靠的方法来控制安全的 Android Keyguard。主要是显示自定义锁屏。我知道谷歌已经声明自定义锁屏不受该平台的正式支持,并且应该预料到事情会被破坏,但是,利用现有的 API,我相信一定有办法做到这一点。我已经做了大约一周的大量研究,但仍然到处都有问题。假设启用了安全的键盘保护,到目前为止我已经实现的是,

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 允许在屏幕上显示活动(窗口),将键盘锁放在后面,并阻止所有不安全的操作。通知面板被禁用,完成活动将弹出键盘锁。我在锁屏活动中实现如下。

    @Override
    public void onAttachedToWindow() {
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
    
  • KeyguardManager, KeyguardManager.KeyguardLock是已弃用的类,但它们仍然可以一直工作到 Jelly Bean。为此,我有一个Service处理两件事,保持静态KeyguardManager和相关的对象,并让它持有BroadcastReceiver受到Intent.ACTION_SCREEN_ON and Intent.ACTION_SCREEN_OFF。 (所有对象都已正确初始化)


For ScreenReceiver

public static synchronized void disableKeyguard() {
    if ( isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.disableKeyguard();
        isLocked = false;
    }
}

public static synchronized void reenableKeyguard() {
    if ( !isLocked ) {
        if ( keyguardLock == null ) {
            keyguardLock = keyguardManager.newKeyguardLock(LOG_TAG);
        }
        keyguardLock.reenableKeyguard();
        keyguardLock = null;
        isLocked = true;
        }
}

For BroadcastReceiver

@Override
public void onReceive( Context context, Intent intent ) {
    if ( intent.getAction().equals(Intent.ACTION_SCREEN_ON) ) {
        Intent start = new Intent(context, LockScreen.class);
        start.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(start);
    } else if ( intent.getAction().equals(Intent.ACTION_SCREEN_OFF) ) {
        ScreenReceiverService.reenableKeyguard();
    }
}

For LockScreenActivity,当用户输入正确的密码后,

window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
ScreenReceiverService.disableKeyguard();
finish();

问题

  • 有效的事情

    • ACTION_ON and ACTION_OFF被可靠地接收。
    • LockScreenActivity 显示在 Keyguard 之前(尚未处理电话状态)
    • 通知无法下拉,以任何方式退出 Activity 都会显示锁屏。
  • 不起作用的事情

    • 我禁用后Keyguard并调用 finish(),我的应用程序退出并显示主屏幕或屏幕关闭之前的最后一个活动。但是,每当我按下 Home 键时,Keyguard 就会闪烁到屏幕中,并立即快速消失,并且不会处理正常的 Home 键功能/事件(闪烁后不会返回主屏幕)。当我反复快速点击主页键时,观察到了这一点。

我什至查看了 Android 源代码以找出 Home 键处理,但它永远不会发送到第三方应用程序,除非窗口类型是WindowManager.LayoutParams.TYPE_KEYGUARD or WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,即使它在早期平台上工作,也会在 4.0+ 上抛出 SecurityException。而对于Keyguard,我已声明DISABLE_KEYGUARD权限使用这应该不是问题。我的猜测是旗帜FLAG_SHOW_WHEN_LOCKED会告诉系统处理Keyguard在某些方面会与其他禁用调用发生冲突。由于该标志主要用于警报/短信类型的应用程序,即向用户显示有限的信息,然后自行关闭并调出Keyguard。但就我而言,让用户解锁我的锁定屏幕然后解锁系统锁定屏幕根本违背了我的应用程序的目的。

所以问题是为什么Keyguard禁用后每次按 Home 都会闪烁?此问题有任何解决方法/解决方案吗?

附:感谢您阅读这么长的问题。这是我第一次在这里提问,如果我做错了什么,请告诉我(即格式、语法、代码约定、标签等)。而且我没有任何编程知识的经验,在我知道Java是什么之前我就开始使用Android。所以我还没有参加任何适当的课程/培训,这个社区很棒,经常帮助像我这样的人,即使他们是简单的问题,当然观看 Google I/O 视频、阅读博客、阅读其他人的代码对我帮助很大。因此,请容忍任何愚蠢的错误/明显的错误/愚蠢的问题。我才16岁。^_^”


我已经在 Gingerbread 和 ICS 中使用它来打开我的活动(通过启动它的后台服务),并取得了一些成功。在正在开始的活动中:

@Override
public void onAttachedToWindow() {
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_FULLSCREEN | 
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在安全的 Android 锁屏中使用 FLAG_SHOW_WHEN_LOCKED 和 disableKeyguard() 的相关文章

  • Android - 如何一次只允许播放一个 MediaPlayer 实例?

    我正在尝试创建一个简单的 Sound board Android 应用程序 使用 ListView 项目作为按钮 顺便说一句 我是一个新手程序员 我的想法是 我按下一个按钮 就会播放一个特定的声音文件 如果我在播放声音时按下任何按钮 它应该
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • Firebase:如何在Android应用程序中设置默认通知渠道?

    如何设置default通知渠道通知消息当应用程序在后台运行时会出现什么情况 默认情况下 这些消息使用 杂项 通道 如你看到的在官方文档中 https firebase google com docs cloud messaging andr
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s

随机推荐

  • 预定的网络作业

    我正在创建一个新的 Azure WebJob 项目 它似乎是可以作为 Web 作业运行的控制台应用程序的优化版本 我希望这项工作根据时间表运行 但在Main 方法 见下文 微软为您提供了host RunAndBlock 使作业能够连续运行
  • 在 iOS 中创建 RTF 、 DOC 或 DOCX

    我想使用 iOS 应用程序创建以下文件类型之一 RTF DOC 或 DOCX 用户应该能够写文字并且添加图像到它 UI 的构建不是问题 问题只是文件的创建 有没有最佳实践可以做到这一点 第三方框架是一种选择 但我想自己做 Thanks 我可
  • 即使捕获了鼠标,如何才能获取鼠标位置的元素?

    有没有办法获取鼠标位置的元素 我正在使用 Mouse DirectlyOver 仅当鼠标未被捕获时它才能正常工作 如果鼠标被捕获 它会获取鼠标捕获的元素 该元素不一定是鼠标所在位置的元素 事实上 MSDN 文档说 如果某个元素具有鼠标捕获功
  • 哪个是好的开源用户管理系统? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 UIView 中的位置转换为 SKScene

    我想在 UIView 中使用 touchBegan 功能 并且应该触发 SKScene 方法 一切都几乎正常 除了我的 SKNode 的起始位置与 UIView 中的触摸不同之外 我在这里读到 Swift 中令人困惑的反向触摸事件 http
  • 查找 3 个输入的最大值 VBA

    我正在尝试找到最多 3 个输入 问题不在于算法 因为当我在 python 中制作相同的脚本时 它工作得很好 问题是它没有按预期工作 我将写一些场景以及结果 8 5 12 最多 125 8 12 最多 1212 5 8 最多 812 8 5
  • 用于选择首选糖果的高效 SQL 2000 查询

    我希望我能想出一个更具描述性的标题 如果您能说出我要询问的查询类型 请建议一个或编辑这篇文章 数据库 SQL Server 2000 示例数据 假设 500 000 行 Name Candy PreferenceFactor Jim Cho
  • 获取 XPath 中标签后面的文本

    我正在尝试使用 Selenium 进行一些测试 但遇到了一些问题 假设我有以下内容 div class itemize row p class subText span class item label Card Color span Ma
  • Action 到子动作的链接

    我已经调用了另一个视图Html Action方法 当用户单击操作链接时 我想在子视图内使用参数调用相同的操作 当我编写此代码时 我收到此错误消息 Html ActionLink link Configure new id 2 配置 操作只能
  • Cron 不将参数传递给 PHP 脚本

    我有一个 cron 作业集 例如 php home novinarb public html index php uri cron 24satahr 但 uri 参数根本没有到达 php 脚本 我也尝试过在 uri 前面没有 但仍然没有 有
  • Swing:JTable 结构更改后 JScrollPane 不刷新

    我有一个 JTable 与 DefaultTableModel 关联 位于 JPanel 中 SpringLayout 位于 JScrollPane 中 当我使用下面的方法修改 DefaultTableModel 的结构时 JTable 会
  • Hibernate createNativeQuery 返回 Clob 的代理对象

    我被迫陷入使用 hibernate createNativeQuery 返回对象数组列表的情况 我的查询返回值的 许多 列之一是 CLOB 返回的对象是 com sun Proxy 对象 我看到一个问题here https stackove
  • 如何通过XML在Spring bean中设置XmlAdapters的Jaxb2Marshaller列表?

    我正在尝试定义一个Jaxb2MarshallerSpring WS 中的 bean 使用扩展的自定义适配器XmlAdapter 我的 XML 文件中有以下内容
  • 文本聚类主题建模效率低下

    我尝试使用 LDA 进行文本聚类 但它没有给我不同的聚类 下面是我的代码 Import libraries from gensim import corpora models import pandas as pd from gensim
  • 什么是脚手架?它是特定平台的术语吗?

    脚手架 是什么 这是仅限 Rails 的东西吗 脚手架通常是指快速设置应用程序的骨架 它不仅仅是 Rails 因为其他平台也有它 它通常也不意味着是一个 最终 系统 只是第一个 最小的方法
  • 在 Python 中使用 Re 删除双空格/制表符组合

    我想使用 Re 模块将 Python 中存在连续制表符和 或空格的所有实例替换为单个空格 我不想删除新行 这排除了 s 推荐 目前我有 formateed string re sub t formateed string formateed
  • 如何使用流获取嵌套集合中的所有元素

    我有一个包含不同嵌套集合的类 现在我想接收嵌套集合的所有元素 具体我想收集集合的所有 StrokePoints 我可以用 旧 java解决它 但如何用流来解决它 int strokesCounter 0 List
  • 名为“DefaultApi”的路由已在路由集合中

    这个问题可能看起来重复 但这略有不同 在所有其他问题中 我注意到他们注册了多条路线 但就我而言 我只有一条路线 我正在创建 asp net webapi framework 4 5 并且在 RegisterRoutes 方法中只有一条路由
  • 在本地找不到元数据

    在本地机器上 我安装了一个带有 Maven 存储库的 Artifactory 并且我的项目有一个非常简单的 pom 文件 它指向它
  • 在安全的 Android 锁屏中使用 FLAG_SHOW_WHEN_LOCKED 和 disableKeyguard()

    上下文 最近 我一直在寻找可靠的方法来控制安全的 Android Keyguard 主要是显示自定义锁屏 我知道谷歌已经声明自定义锁屏不受该平台的正式支持 并且应该预料到事情会被破坏 但是 利用现有的 API 我相信一定有办法做到这一点 我