Android 8.1.0 源码修改之 - 屏蔽 Home 按键

Android开机霸屏与自启:从CATEGORY_HOME到系统定制的完整实现方案 在操作系统启动流程中,开机自启动是系统服务与应用初始化的重要机制。其核心原理在于系统启动完成后,通过广播或特定Intent触发预设组件的加载。在Android生态中,这一机制通过BOOT_COMPLETED广播和CATEGORY_HOME Intent实现,前者用于后台服务启动,后者则用于桌面应用接管。从技术价值看,这为智能设备、工业控制、自助终端等场景提供了设备即服务的可能性,确保设备开机即进入专用工作状态。在应用场景层面,广告机、餐饮终端、工控平板等设备都需要开机后直接进入全屏应用界面,避免用户误操作退 阅读详情

众所周知,想要屏蔽Android 的 Back 按键,很简单,像下面这样操作就可以了:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (符合某特定条件) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

 

那如果想要屏蔽 Home 的话,就不这么简单了。Home 按键事件的响应与否,是在 framework 中做决定的。(回想一下,如果在自己的应用的 Activity 节点下配置过滤条件 <category android:name="android.intent.category.HOME" />,那点击了系统底部NavigationBar 中的 Home 按键之后,系统底部栏会弹出一个选择框,让用户选择设置系统默认的 Launcher3 作为主界面还是选择自己的app作为主界面。)因此,想要屏蔽 Home 按键响应与否,需要在 framework 中做一些事情。

 

当前项目组中做了一个儿童模式的应用:设置儿童模式下只能使用10分钟,10分钟倒计时结束之后,用户只有解锁设备之后,才可以继续使用设备。因此当倒计时结束之后、用户未解锁之前,back 按键以及Home 按键都不可以被触发。怎么实现呢?

 

前置条件:有整套可以编译通过的 Android 源码;有设备可以刷机验证;Windows。

基于现有条件,分析寻找解决方案:

如果想屏蔽掉Home 按键,首先就得在 PhoneWindowManager.java 的 interceptKeyBeforeDispatching() 方法中 return,如下所示:

    @Override
    public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

        //code ......
   
        // First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {

            if (符合某种条件) {
                Log.i(TAG, "Ignoring HOME; Because currently is in child mode.");
                return -1;
            }

            //code ......
       
        }  

            //code ......

    }

所以这里主要就是给某种条件赋值了,可以在 System的全局变量 Global  中写入一个数值,在  PhoneWindowManager.java 中的这个方法处使用这个数值:当这个数值为1的时候,则直接return 不处理Home 按键;当这个变量值为0的时候,默认Home按键是可以被点击的。

那么问题来了,当前儿童模式应用不是系统应用,它是没办法直接修改 framework下 System 下的 Global  中的全局变量的,怎么处理呢, 当前想到的简单的可实现的方式就是使用广播:当符合某种条件的情况下,发送广播给到系统应用SystemUI,在SystemUI 中修改 framework下的 System 下的 Global  中的全局变量,这样是可以达到目的的。

基于以上分析,可以分为三个步骤来实现这个需求:

【第一步】在儿童模式中发送广播:

    private final static String ACTION_CAN_HOME_BUTTON_BE_CLICKED = "com.xxxxx.xxxxx.xxxxx.be.clicked";
	
    private final static String HOME_BUTTON_CAN_BE_CLICKED = "com.xxxxx.xxxxx.xxxxx.canbe.clicked";

sendBroadcastTellPhoneWindowManagerCanHomeButtonBeClicked(true or false);

    /**
	
     * By sending a broadcast delivery message, it works with PhoneWindowManager to determine if
	
     * the Home button can be clicked in the current situation.
	
     *
	
     * @param canHomeBtnBeClicked  true : Android System Home button can be clicked.
	
     *                             false : Android System Home button can not be clicked.
	
     */
	
    private void sendBroadcastTellPhoneWindowManagerCanHomeButtonBeClicked(boolean canHomeBtnBeClicked) {
	
        if (canHomeBtnBeClicked){
	
            Log.i(TAG,"Send Broadcast to make HomeButton can be clicked.");
	
        }else {
	
            Log.i(TAG,"Send Broadcast to make HomeButton can not be clicked.");
	
        }
	
        Intent i = new Intent();
	
        i.setAction(ACTION_CAN_HOME_BUTTON_BE_CLICKED);
	
        i.putExtra(HOME_BUTTON_CAN_BE_CLICKED, canHomeBtnBeClicked);
	
        this.sendBroadcast(i);
	
    }

【第二步】在 Framework 下定义参数,并根据参数数值决定处不处理Home按键事件

在 folder\frameworks\base\core\java\android\provider\Settings.java 的 class Global中添加如下:

 
	
        public static final String HOMEBTN_CANUSE = "homebtn_canuse";

在  folder\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java 中修改如下:

//添加PWM全局变量
int mHomeKeypadShield;

//在 SettingsObserver 注册
    class SettingsObserver extends ContentObserver {
        SettingsObserver(Handler handler) {
            super(handler);
        }
        void observe() {
            // Observe all users' changes
            //code......
	
            resolver.registerContentObserver(Settings.Global.getUriFor(
	
                    Settings.Global.HOMEBTN_CANUSE), false, this,
	
                    UserHandle.USER_ALL);
	
            //end
            updateSettings();
        }
    }

//在 updateSettings() 中修改

    public void updateSettings() {
        //code...
        synchronized (mLock) {
	
            mHomeKeypadShield = Settings.Global.getInt(resolver,
	
            Settings.Global.HOMEBTN_CANUSE, 0);
        }
        //code...

     }


//关键代码!!
    @Override
    public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

        //code ......

        if (keyCode == KeyEvent.KEYCODE_HOME) {

            if (1 == mHomeKeypadShield) {
                Log.i(TAG, "Ignoring HOME; Because currently is in child mode.");
                return -1;
            }

            //code ......

       
        }  

            //code ......

    }

【第三步】在 SystemUI 中处理接受到的广播事件

修改 folder\vendor\rockchip\xxxxx\apps\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.java 中:

 

    // ================================================================================
    // Constructing the view
    // ================================================================================
    protected void makeStatusBarView() {

        //code...


        //Make the Home button available by default
	
        Settings.Global.putInt(mContext.getContentResolver(), "homebtn_canuse", 0);


        //code....

        
        HomeButtonWhetherCanBeClickedBroadcast mHomeButtonBroadcast = new HomeButtonWhetherCanBeClickedBroadcast();
	
        IntentFilter filter3 = new IntentFilter();
	
        filter3.addAction("com.xxxxx.xxxxx.xxxxx.be.clicked");
	
        context.registerReceiver(mHomeButtonBroadcast,filter3);

    }


    public class HomeButtonWhetherCanBeClickedBroadcast extends BroadcastReceiver{
	
        @Override
	
        public void onReceive(Context context, Intent intent) {
	
             Log.i(TAG, "--------------Receive HomeButtonWhetherCanBeClickedBroadcast---------------");
	
             if (intent != null) {
	
                 boolean homeButtonCanUse = intent.getBooleanExtra("com.xxxxx.xxxxx.xxxxx.canbe.clicked",false);
	
	
                 if (homeButtonCanUse) {
	
                    Log.i(TAG, "home button can use.");
	
                    Settings.Global.putInt(mContext.getContentResolver(), "homebtn_canuse", 0);
	
                 }else{
	
                    Log.i(TAG, "home button can not use.");
	
                    Settings.Global.putInt(mContext.getContentResolver(), "homebtn_canuse", 1);
	
                 }
	
             }
	
        }
    }

 

这样就可以了,当前来说没发现什么问题。

但是这个地方,其实还有待优化的地方:

1.比如这个广播最好做成带有权限的广播,可以防止其他人在自己的应用中恶意发广播。

2.还可以在儿童模式中添加 ANR 情况时候的处理机制(如果在儿童模式到期之后,用户所打开的大型游戏导致了内存吃进,甚至 ANR,用户在这种情况下用户又无法手动解锁。那可以设置:当 ANR 一定的时间之后,重启机器)。

3.当前是使用广播机制实现的这个功能,但是这样的话,缺少对操作结果的检验过程,当然如果当修改结果成功之后再次发送一个广播出来给到对应的 app 也不是不可以,但是这就有点儿消耗性能:广播满天飞。既然涉及到跨进程通讯,是不是还可以使用 AIDL 的方式来实现对变量的修改呢?待验证。

当然肯定还有其他更好的方式,如果你有更好的处理方式,欢迎评论留言大家交流一下哇。

最后,这个功能的实现参考了其他人的博客,再次表示感谢。

参考:

https://blog.youkuaiyun.com/u012169524/article/details/51147518

https://blog.youkuaiyun.com/jlminghui/article/details/39268419

 

 

 

 

基于Unity3D与Android的车载3D桌面开发实战:从模型优化到系统集成 3D实时渲染技术通过构建虚拟三维空间与模型,为用户提供沉浸式的视觉与交互体验,其核心原理在于图形管线对顶点、纹理与光照的计算。这项技术在提升信息呈现维度与用户参与感方面具有重要价值,广泛应用于游戏、仿真与数字孪生等领域。在嵌入式与移动场景中,如智能座舱系统,开发者常面临性能约束与系统集成的挑战。本文聚焦于利用Unity3D引擎与Android原生开发框架,打造高性能的车载3D桌面应用。内容涵盖从工业模型(如SolidWorks导出格式)的减面、展UV等优化处理,到在车机环境下进行Draw Call合并、LO 阅读详情

相关推荐

Android应用开发:屏蔽Home键的方法与示例代码

请注意,尽管上述代码可以屏蔽大部分情况下的Home键操作,但无法完全屏蔽所有情况下的Home键操作。在Android应用开发中,有时候我们希望屏蔽Home键的功能,以防止用户意外地离开我们的应用程序。要屏蔽Home键,我们需要在应用程序的Activity中捕获并处理Home键的按下事件。方法,在窗口失去焦点时发送一个关闭系统对话框的广播,以防止用户通过长按Home键来启动最近使用的应用列表。方法,在用户按下Home键时执行自定义操作,例如显示一个提示,告知用户无法使用Home键。方法,将窗口类型设置为。

HackWhisper的博客 406

Android 屏蔽返回键(后退键)

Android上有两种方法来获取该按钮的事件推荐方案一,不推荐使用方案二,因为方案二可能在某些Android 设备上不生效。

UrasakiNakajima的博客 3214

Android代码-屏蔽home按键

Android-HomeKey-Locker Utility to disable HOME KEY in Android Activity. As there are a lot questions about "how to disable home button in android?" on Stack Overflow, such as how to disable home button in android? Android - Is It possible to disable the click of home button How to disable Home and other system buttons in Android? This library provide a easy way to do this job. NOTICE This library doesn't support devices with VIRTUAL HOME KEY, such as Galaxy Nexus Nexus 4 Nexus 5 Nexus 7 Demo

高通 Android 10/Android 12 应用里面拦截Home键功能

4、Android 12 也是在PhoneWindowManager里面interceptKeyBeforeDispatching 去拦截Home键 代码如下。2、可能大家一想到拦截脑海里面可能会想到dispatch/或者onkeydown或者onTouchEvent事件等等,可能网上也有一些文章比如像这种。

郑敏 2204

android里面屏蔽home键/禁止Home键或者随你DIY

可以先禁止Home键,再在onKeyDown里处理按键值,点然后在击Home键的时候就把程序关闭,或者随你DIY等等,感觉你可以随心所欲吧,再接再厉,希望本文可以帮助到你

3D缺陷检测实战:从点云处理到工业质检优化

本文深入探讨了3D缺陷检测在工业质检中的实战应用,详细阐述了从点云处理到深度学习模型部署的完整技术链路。文章通过PCB焊点检测等实际案例,分析了3D视觉相比2D检测在识别深度、形状等缺陷方面的优势,并分享了点云滤波、分割、特征提取以及利用YOLOv5等模型进行高效检测的优化心得与落地挑战。

weixin_28358083的博客 336

dialog,activity 屏蔽Home键详解(转)

相信在Android应用上,很多时候逻辑是需要屏蔽Home键的,但这个用户体验是否需要,就看各位的需求了。     一般的方法屏蔽Home键,大家一定看过不少文章了。我总结一下,先说一下一般情况下Activity的屏蔽按键和Home键吧。 屏蔽其他键,重写onKeyDown  Java代码   @Override   public boolean onKeyDown(int k...

羊村の村长 307

利用python-docx提取word的高亮部分

利用python-docx提取word的高亮部分 没有找到分享的文档,于是就自己研究了一下。 可以通过python里的python-docx去提取word内的高亮文本。 file=docx.Document(filepath) for para in file.paragraphs: for i in para.runs: #i.font.highlight_color设置了高亮颜色 if i.font.highlight_color is not None:

double_0221的博客 1809

Android屏蔽Home按键

Android HomeKeypad Shield(安卓Home键屏蔽)

Ryan的博客 6062

HarmonyOS开发第一步:Dev Eco Studio4.0保姆级安装配置指南(含Node.js环境)

本文提供HarmonyOS开发环境搭建的保姆级教程,重点详解Dev Eco Studio 4.0的安装与配置,并攻克Node.js环境与Ohpm包管理器的关键设置难点。通过清晰的步骤指引,帮助开发者从零开始,高效完成开发环境部署,顺利迈出鸿蒙应用开发的第一步。

lake5的博客 567

从零构建:基于Docker与FRR的OSPF虚拟网络实验室

本文详细介绍了如何利用Docker与FRR构建OSPF虚拟网络实验室,从环境设计到高级网络拓扑配置,再到实验验证与排错。通过容器化技术实现高效资源利用和快速部署,特别适合网络协议教学、企业网络架构验证等场景。

plum99的博客 220

android pwm0 编译_Android 8.1.0 源码修改之 - 屏蔽 Home 按键

众所周知,想要屏蔽Android 的 Back 按键,很简单,像下面这样操作就可以了:@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (符合某特定条件) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {...

weixin_42504785的博客 255

深入浅出卡尔曼滤波器算法

深入浅出讲解卡尔曼滤波器的工作原理及其公式推导,讨论卡尔曼滤波器的核心公式所代表的意义及个人的理解。

m0_37835056的博客 1364

Android源码(6.0和8.1) 屏蔽状态栏下拉和屏蔽导航栏显示

之前写过一遍6.0的导航栏屏蔽分析过程,可参考Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 屏蔽状态栏下拉 6.0解决办法 源码位置 SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarView.java @Override p...

cczhengv 6873

【异常】OpenClaw报错 400 Total tokens of image and text exceed max message tokens. Request

OpenClaw报错400(Token超限)解决方案摘要 该报错因文本/图片总Token数超过模型限额导致,常见于多轮对话累积或单次请求过大。提供三级解决方案: 应急处理:输入"/new"指令清空会话历史,立即重置Token计数(90%问题可解决) 折中方案:保留历史对话前提下,通过精简当前输入、删除早期无关对话或拆分请求来压缩Token 专属处理:单次请求超限时,拆分长文本为2000字以内段落,或分批次上传降低分辨率图片 长期预防建议定期使用"/new"开启新会话,

奶爸的编程之路,也就一周冷个三天 1389

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8383

android 源码 在状态栏添加 虚拟按键(back,home,menu)

的版本有用,android2.3的代码和架构发生了不少变化,下面说说如何在在android2.3实现在状态栏中增加menu,home和back快捷键,本文大部分引用上面两篇文章,感谢两篇博文作者提供参考。    1、准备资源,修改XML文 准备几张图,这里我们准备添加home back和menu图标,就需要准备6张图,三张普通状态,三张按下的高亮状态图标: stat_home.png s

yanzhi_android的专栏 3164

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1286

Android 10 系统屏蔽底部按键 禁止锁屏 禁用横屏

一、屏蔽底部按键 1,先说状态栏 状态栏其实就是SystemUI.apk,源码目录是android/frameworks/base/packages/SystemUI/,但是状态栏的隐藏并不是修改SystemUI中的内容,而是修改android/frameworks/base/core/res/res/values/dimens.xml中的内容,这个文件是整个android系统公用的,一般不直接修改,而是通过overlay机制进行覆盖修改,用到overlay又必须提到板型目录,我们知道android/d

a546036242的博客 3658

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 7.0平台客制化虚拟导航按键(隐藏NavigationBar,上滑显示NavigationBar)

如图,需求是增加一个按钮可以隐藏NavigationBar,上滑显示NavigationBar。  参考文章: Android 8.1平台客制化虚拟导航按键 Android 7.0 虚拟按键(NavigationBar)源码分析(一) 之 View的创建流程 android导航栏隐藏与浮现 1.首先新建一个hide_show.xml,其中systemui:keyCode="142"为...

cuckoochun的专栏 4427

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

遥控器KEYCODE相关技术文档

遥控器测试程序相关技术文档 1. 关于如何屏蔽部分特殊按键 遥控器中有些特殊按键是经过Android 特殊处理的 ,在--中,这些特殊按键会妨碍遥控器按钮的测试,所以必须屏蔽。 屏蔽的方法有一下几种: 1. 在PhoneWindowManager.java中,对于特殊按钮部分的代码进行处理。 2. 在onkeydown()方法中,获得对应按钮的keycode之后,进行自己想要的操

xiaodanpeng的专栏 3432

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8192

隐藏android系统的状态栏和导航栏

android系统默认都是会显示顶部的状态栏和底部的导航栏的,但很多时候我们需要将他们隐藏掉,那么我们就看看怎么把他们隐藏掉。

lizekun2010的博客 8576

自动化:Python、windows、安卓、网页、rpa、autojs、firerpa(抓包逆向ai)

通过VS安装一步到位更省事。如果这个环境变量是空的,uiautomator 将返回 connect_usb,您需要确保只有一个设备连接到计算机。然后就会自动安装库所需要的设备端程序:uiautomator-server,atx-agent,openstf / minicap,openstf / minitouch。因为 run_main 执行的时候,是打印所有用例文件+名称,而通过测试套件 添加 类名称时,执行方式不一样。也可以使用pyautogui库帮助文档的方法,不过本人认为使用上面的方法,更加便利。

freeking101的博客 2万+

Android 13 系统 App 假待机方案全流程总结​

一、核心需求背景​用户需在 Android 13 系统 App 中实现 “假待机” 功能,同时满足以下关键诉求:​二、核心技术方案​1. 假待机实现(低功耗黑屏 + 网络保活)​2. 前台锁定方案(防切换 + 自动恢复)​3. 系统设置兼容流程(临时访问 + 闭环返回)​三、关键组件与代码核心​1. 核心工具类​2. 主 Activity 整合逻辑​3. 权限与配置要点​四、功能验证与关键特性​1. 验证要点​2. 核心特性总结​五、常见问题与注意事项​。

ZHANG13HAO的博客 947

Android recovery流程解析

恢复出厂设置流程概括: 一. 设置模块中进行恢复出厂设置操作,系统一共做了两件事: 1. 往 /cache/recovery/command 文件中写入命令字段: 2. 重启系统 二. 重启系统会必须进入 recovery 模式 进入 recovery 模式的几种方式 1. 通过读取 /cache 分区中文件 /cache/recovery/comm...

quanminchaoren 319
上一篇: Android 8.1.0 源码探究之 - 为啥给设备设置锁屏密码以后,重启设备会看到屏幕会变得比关机之前亮(解锁后亮度恢复为重启之前的亮度)
下一篇: Android 8.1.0 源码修改之 - 给自己预置到系统的预置应用添加一些默认权限
Water_Marking
博客等级 码龄11年 18粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值