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?

  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
2.重写onAttachedToWindow方法

[java] view plaincopyprint?

  1. @Override
  2. public void onAttachedToWindow() 
  3. this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
  4. super.onAttachedToWindow(); 
3.重写onkeyDown方法

[java] view plaincopyprint?

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) 
  3.     { 
  4. switch (keyCode) 
  5.         { 
  6. case KeyEvent.KEYCODE_HOME: 
  7. //TODO 1:home key
  8. break; 
  9. case KeyEvent.KEYCODE_POWER: 
  10. //TODO 2:power key
  11. break; 
  12.         } 
  13. return super.onKeyDown(keyCode, event); 
  14.     } 

测试结果:2.3之前的版本没有去测试,在手中4.0版本中,程序无法运行。出错打印:

[html] view plaincopyprint?

  1. java.lang.IllegalArgumentException: Window type can not be changed after the window is added 

与重写onAttachedToWindow方法有关,没有再去调试,放弃该方法。

第二种方法:通过检测log,根据log判断是否有点击Home键

此种方式只能判断是否点击Home键,不能真正的拦截Home的功能。

[java] view plaincopyprint?

  1. private boolean isTesting = true; 
  2. class CatchLogThread extends Thread 
  3. @Override
  4. public void run() 
  5.     { 
  6.         Process mLogcatProc = null; 
  7.         BufferedReader reader = null; 
  8.         String line; 
  9. while (isTesting) 
  10.         { 
  11. try
  12.             { 
  13. // 获取logcat日志信息
  14.                 mLogcatProc = Runtime.getRuntime().exec( 
  15. new String[] {"logcat", "ActivityManager:I *:S"}); 
  16.                 reader = new BufferedReader(new InputStreamReader( 
  17.                    mLogcatProc.getInputStream())); 
  18. while ((line = reader.readLine()) != null) 
  19.                 { 
  20. if (line.indexOf("android.intent.category.HOME") > 0) 
  21.                     { 
  22.                         isTesting = false; 
  23.                         handler.sendMessage(handler.obtainMessage()); 
  24.                         Runtime.getRuntime().exec("logcat -c");// 删除日志
  25. break; 
  26.                     } 
  27.                 } 
  28.             } 
  29. catch (Exception e) 
  30.             { 
  31.                 e.printStackTrace(); 
  32.             } 
  33.         } 
  34.     } 
  35. }; 
  36. Handler handler = new Handler() 
  37. public void handleMessage(android.os.Message msg) 
  38.     { 
  39.         Log.i(TAG, "Home key press"); 
  40. // do something here
  41.     }; 
  42. }; 

第三种方法:修改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?

  1. case KeyEvent.KEYCODE_POWER: { 
  2. int powerStatus = 0; 
  3. try
  4.                 { 
  5.                     powerStatus = android.provider.Settings.System.getInt( 
  6.                         mContext.getContentResolver(), "boot_default_channel_open"); 
  7.                 } 
  8. catch (Exception e) 
  9.                 { 
  10.                     powerStatus = 0; 
  11.                     e.printStackTrace(); 
  12.                 } 
  13. if(powerStatus ==1) 
  14.                 { 
  15. //send power key broadcast.
  16.                     Intent powerIntent =new Intent("com.soctt.dvb.factorytest.keytest"); 
  17.                     mContext.sendBroadcast(powerIntent); 
  18. // forbid power key function.
  19. return 0; 
  20.                 } 
  21. …… 
  22. break

编译镜像,烧录镜像。好的,镜像完成了,下面就是测试修改的效果了。写一个测试程序。

[java] view plaincopyprint?

  1. public class MainActivity extends Activity 
  2. private static final String TAG = "MainActivity"; 
  3. public void onCreate(Bundle savedInstanceState) 
  4.     { 
  5. super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         registReceiver(); 
  8. // listenerHome();
  9.     } 
  10. @Override
  11. protected void onStart() 
  12.     { 
  13. super.onStart(); 
  14.         saveSettings(); 
  15.         echoSettings(); 
  16.     } 
  17. private void registReceiver() 
  18.     { 
  19.         IntentFilter filter = new IntentFilter(); 
  20.         filter.addAction("com.pbi.dvb.factorytest.keytest"); 
  21.         registerReceiver(keyReceiver, filter); 
  22.     } 
  23. private BroadcastReceiver keyReceiver = new BroadcastReceiver() 
  24.     { 
  25. public void onReceive(Context context, Intent intent) 
  26.         { 
  27.             Log.w(TAG, "-----Recevie the broadcast!!--------" + intent.getFlags()); 
  28.         } 
  29.     }; 
  30. } 

运行测试:

此时,我们在接收到广播后,就可以处理自己的业务逻辑了。

参考内容:http://blog.csdn.net/myarrow/article/details/8143717

http://blog.csdn.net/goleftgoright/article/details/7756111

Android 屏蔽Power键 Home键的更多相关文章

  1. 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法

    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...

  2. Atitit.android js 的键盘按键检测Back键Home键和Menu键事件

    Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...

  3. 浅析WPhone、Android的Back与Home键

    浅析WPhone.Android的Back与Home键 背景 本人一直在用诺基亚手机(目前是Nokia 925,Windows Phonre 8.1),在界面设计.应用多样性等方面没少受身边Andro ...

  4. Android 如何监听返回键,弹出一个退出对话框

    android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...

  5. android webview点击返回键返回上一级activity

    android webview点击返回键返回上一个activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { ...

  6. MFC对话框屏蔽Enter和ESC键

    MFC对话框屏蔽Enter和ESC键参考:http://www.docin.com/p-122354833.html 方法一重载PreTranslateMessage函数 BOOL CXXDlg::P ...

  7. android webview点击返回键回到上一个html

    android webview点击返回键返回上一个html @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( ...

  8. 【Android】Android实现监听返回键,主键(HOME),菜单键

    目录结构: contents structure [+] 简介 监听 返回键 监听 主键(Home键) 监听 菜单键 一.简介 本篇文章介绍如何在Android中实现监听返回键,主键,菜单键.一般情况 ...

  9. Android监听键盘右下角确定键

    代码改变世界 Android监听键盘右下角确定键 kotlin写法 <EditText android:id="@+id/seachFriend" android:layou ...

随机推荐

  1. export / import 温故而知新

    认知一: 导出的对象被修改,依然会影响原来的对象. 仔细想想这是理所当然的事(说明导出的依然是对象指向内存的地址,所以通常还需要结合深拷贝使用) /** export const state = { ...

  2. function 与 => 的区别

    在JS中,箭头函数并不是简单的function(){}匿名函数的简写语法糖,实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,在编写函数时就已经确定了.而匿名函数的this ...

  3. 对ThreadLocal实现原理的一点思考

    前言 在<透彻理解Spring事务设计思想之手写实现>中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从而保证了事务.本篇博客 ...

  4. 《转》vue更新到2.0之后vue-resource不在更新,axios的使用

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...

  5. MXNET:深度学习计算-GPU

    mxnet的设备管理 MXNet 使用 context 来指定用来存储和计算的设备,例如可以是 CPU 或者 GPU.默认情况下,MXNet 会将数据创建在主内存,然后利用 CPU 来计算.在 MXN ...

  6. VueThink配置

    vuethink 配置 原文地址:http://blog.csdn.net/hero82748274/article/details/76100938

  7. 解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large

    在做查询数据库操作时,报了以上错误,还有out of memery heap hacp ,原因是MySQL的max_allowed_packet设置过小引起的,我一开始设置的是1M,后来改为了20M ...

  8. AD域部署使用bginfo软件

    实验网络拓扑图: 实验目标: bginfo收集信息服务器通过bginfo软件收集每个域客户端信息录入到SQL server 2008数据库 bginfo软件官网下载地址: https://docs.m ...

  9. 基于Java实现批量下载网络图片

    昨天朋友做项目遇到一个需求,需要把上千个的微博表情图片下载到本地磁盘,并做好规范命名,塞给我一堆Json数据,让我帮忙处理下,反正闲着也没事干,就帮忙写了.(很简单的一个功能,随手记录下,刚好填补下最 ...

  10. 【Mac brew】代理安装brew insall

    http_proxy=dev-proxy.**.**:8080 https_proxy=dev-proxy.**.**:8080  brew install npm