首页 > 移动平台 > 详细

Android 屏蔽Power键 Home键

时间:2015-11-20 12:20:29      阅读:251      评论:0      收藏:0      [点我收藏+]

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

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

运行测试:

技术分享

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

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

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

Android 屏蔽Power键 Home键

原文:http://www.cnblogs.com/cute/p/4980099.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!