Android 屏蔽Power键 Home键
Android 屏蔽Power键 Home键
标签: androidpower键Home键PhoneWindowManagerframework
2014-04-18 17:22 1557人阅读 评论(0) 收藏 举报
分类:
Android(46) 
版权声明:本文为博主原创文章,未经博主允许不得转载。
最近正在处理工厂测试的功能,里面有个功能测试是前面板按键功能测试。需求中要求:在按每个前面板按键时,要修改UI中每个对应按键的颜色。其中有两个键Home键,和Power键,程序需要对这两个按键进行拦截,网上查了一些资料,现归纳一下常用的几种方式。
第一种方式:android 对home键的监听(针对2.3以前的版本有效)
1.在manifes文件中添加权限
[html] view plaincopyprint?
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
2.重写onAttachedToWindow方法
[java] view plaincopyprint?
- @Override
- public void onAttachedToWindow()
- {
- this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
- super.onAttachedToWindow();
- }
3.重写onkeyDown方法
[java] view plaincopyprint?
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {
- switch (keyCode)
- {
- case KeyEvent.KEYCODE_HOME:
- //TODO 1:home key
- break;
- case KeyEvent.KEYCODE_POWER:
- //TODO 2:power key
- break;
- }
- return super.onKeyDown(keyCode, event);
- }
测试结果:2.3之前的版本没有去测试,在手中4.0版本中,程序无法运行。出错打印:
[html] view plaincopyprint?
- java.lang.IllegalArgumentException: Window type can not be changed after the window is added
与重写onAttachedToWindow方法有关,没有再去调试,放弃该方法。
第二种方法:通过检测log,根据log判断是否有点击Home键
此种方式只能判断是否点击Home键,不能真正的拦截Home的功能。
[java] view plaincopyprint?
- private boolean isTesting = true;
- class CatchLogThread extends Thread
- {
- @Override
- public void run()
- {
- Process mLogcatProc = null;
- BufferedReader reader = null;
- String line;
- while (isTesting)
- {
- try
- {
- // 获取logcat日志信息
- mLogcatProc = Runtime.getRuntime().exec(
- new String[] {"logcat", "ActivityManager:I *:S"});
- reader = new BufferedReader(new InputStreamReader(
- mLogcatProc.getInputStream()));
- while ((line = reader.readLine()) != null)
- {
- if (line.indexOf("android.intent.category.HOME") > 0)
- {
- isTesting = false;
- handler.sendMessage(handler.obtainMessage());
- Runtime.getRuntime().exec("logcat -c");// 删除日志
- break;
- }
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- };
- Handler handler = new Handler()
- {
- public void handleMessage(android.os.Message msg)
- {
- Log.i(TAG, "Home key press");
- // do something here
- };
- };
第三种方法:修改Framework
这里需要修改的文件为PhoneWindowManager ,
文件位置:frameworks\base\policy\src\com\android\internal\policy\impl
这里我们重点关注:public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) 这个方法,这里对Home键,Power键做了处理,使得我们在应用程序中无法获得两个键的键值,即使通过各种方法获得了键值,也无法屏蔽该功能。因此,决定将部分逻辑放在这个文件中处理。在方法中找到Power键对应的case,添加我的处理逻辑。
[java] view plaincopyprint?
- case KeyEvent.KEYCODE_POWER: {
- int powerStatus = 0;
- try
- {
- powerStatus = android.provider.Settings.System.getInt(
- mContext.getContentResolver(), "boot_default_channel_open");
- }
- catch (Exception e)
- {
- powerStatus = 0;
- e.printStackTrace();
- }
- if(powerStatus ==1)
- {
- //send power key broadcast.
- Intent powerIntent =new Intent("com.soctt.dvb.factorytest.keytest");
- mContext.sendBroadcast(powerIntent);
- // forbid power key function.
- return 0;
- }
- ……
- break
编译镜像,烧录镜像。好的,镜像完成了,下面就是测试修改的效果了。写一个测试程序。
[java] view plaincopyprint?
- public class MainActivity extends Activity
- {
- private static final String TAG = "MainActivity";
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- registReceiver();
- // listenerHome();
- }
- @Override
- protected void onStart()
- {
- super.onStart();
- saveSettings();
- echoSettings();
- }
- private void registReceiver()
- {
- IntentFilter filter = new IntentFilter();
- filter.addAction("com.pbi.dvb.factorytest.keytest");
- registerReceiver(keyReceiver, filter);
- }
- private BroadcastReceiver keyReceiver = new BroadcastReceiver()
- {
- public void onReceive(Context context, Intent intent)
- {
- Log.w(TAG, "-----Recevie the broadcast!!--------" + intent.getFlags());
- }
- };
- }
运行测试:
此时,我们在接收到广播后,就可以处理自己的业务逻辑了。
参考内容:http://blog.csdn.net/myarrow/article/details/8143717
http://blog.csdn.net/goleftgoright/article/details/7756111
Android 屏蔽Power键 Home键的更多相关文章
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...
- Atitit.android js 的键盘按键检测Back键Home键和Menu键事件
Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...
- 浅析WPhone、Android的Back与Home键
浅析WPhone.Android的Back与Home键 背景 本人一直在用诺基亚手机(目前是Nokia 925,Windows Phonre 8.1),在界面设计.应用多样性等方面没少受身边Andro ...
- Android 如何监听返回键,弹出一个退出对话框
android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...
- android webview点击返回键返回上一级activity
android webview点击返回键返回上一个activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { ...
- MFC对话框屏蔽Enter和ESC键
MFC对话框屏蔽Enter和ESC键参考:http://www.docin.com/p-122354833.html 方法一重载PreTranslateMessage函数 BOOL CXXDlg::P ...
- android webview点击返回键回到上一个html
android webview点击返回键返回上一个html @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( ...
- 【Android】Android实现监听返回键,主键(HOME),菜单键
目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...
- Android监听键盘右下角确定键
代码改变世界 Android监听键盘右下角确定键 kotlin写法 <EditText android:id="@+id/seachFriend" android:layou ...
随机推荐
- 蓝牙发现服务UUID(service UUID)
出至<蓝牙标准Core_V4.0>2.5.1 uuid(1576页) 其中 Bluetooth_Base_UUID定义为 00000000-0000-1000-8000-00805F9B3 ...
- 转移 Visual Studio 2017 的安装临时文件
每次更新 Visual Studio 2017 会在 C 盘留下大量的缓存文件,因为目录比较深,怕以后忘了,用目录链接的形式转移到其它磁盘,也好方便清理: mklink /D C:\ProgramDa ...
- 物联网架构成长之路(11)-Redis缓存主从复制
1. 说明 在我的物联网平台框架框架中,会用到Redis这个中间件.作为EMQ权限认证的缓存.https://www.cnblogs.com/think-in-java/p/5123884.html ...
- 【九天教您南方cass 9.1】 04 编码法Ⅱ绘制地形图
同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. [点击索取cass教程]5元立得 (给客服说暗号:“ ...
- 教你一招:笔记本安装mint18时,安装界面显示不全
近日在给自己的笔记本安装mint18时,安装界面显示不全,就是安装时到了分区界面后看不到下一步. 很无奈.... 于是胡乱摸索,得到解决的办法. 按住键盘上的ALT键,用鼠标向上拖动安装的界面,最好是 ...
- visio操作
1.上下标:选中要成为上标的文字,ctrl+shift+"=" 选中要成为下标的文字,ctrl+"="
- Android KK 找不到<cutils/properties.h>
一直通过property来控制android系统的号码匹配位数,之前的项目都工作的好好的,但到了KK时,在sqlite库中引用property的相关方法,却一直编译error... 折腾了好久,发现从 ...
- Leaflet API翻译
转自: http://jsrookie.iteye.com/blog/2318972(上) http://jsrookie.iteye.com/blog/2318973(下) L.Map API各种类 ...
- SPARKR,对RDD操作的介绍
(转载)SPARKR,对RDD操作的介绍 原以为,用sparkR不能做map操作, 搜了搜发现可以. lapply等同于map, 但是不能操作spark RDD. spark2.0以后, spar ...
- rqalpha探究 2 接入mod
程序的目的是尽可能用mod扩展功能,所以接下来需要接入mod模块