2014-04-18 17:22 1557人阅读 评论(0) 收藏 举报

分类:

Android(46)

版权声明:本文为博主原创文章,未经博主允许不得转载。

最近正在处理工厂测试的功能,里面有个功能测试是前面板按键功能测试。需求中要求:在按每个前面板按键时,要修改UI中每个对应按键的颜色。其中有两个键Home键,和Power键,程序需要对这两个按键进行拦截,网上查了一些资料,现归纳一下常用的几种方式。

第一种方式:android 对home键的监听(针对2.3以前的版本有效)

1.在manifes文件中添加权限

2.重写onAttachedToWindow方法 @Override

public void onAttachedToWindow()

{

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

super.onAttachedToWindow();

}

3.重写onkeyDown方法 @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版本中,程序无法运行。出错打印: java.lang.IllegalArgumentException: Window type can not be changed after the window is added

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

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

此种方式只能判断是否点击Home键,不能真正的拦截Home的功能。 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,添加我的处理逻辑。 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

编译镜像,烧录镜像。好的,镜像完成了,下面就是测试修改的效果了。写一个测试程序。 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

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

android4.2 拦截power键,Android 屏蔽Power键 Home键相关推荐

  1. android 外键,android - 创建一个具有外键的sqlite数据库表,作为android中的表列。 我面临以下错误。 我该如何解决 - 堆栈内存溢出...

    创建表的代码: public static final String CREATE_USER_TABLE = "CREATE TABLE " + USER + "(&qu ...

  2. android power 按键,Android Framework层Power键关机流程(一,Power长按键操作处理)

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

  3. 小米一直显示在android,小米三刷机失败!开机一直显示power by android

    满意答案 siemf12165 推荐于 2016.11.04 采纳率:51%    等级:7 已帮助:410人 小米三刷机失败后开机一直显示power by android可以通过重新升级固件的方法解 ...

  4. 屏蔽android的menu键,使menu键不能用,自定义menu键

    在Activity中重写onKeyDown方法,Menu键被屏蔽但HOME键未被屏蔽,其中还HOME屏蔽在我的另外一篇博客中已详细介绍,下面来解决Menu键被屏蔽,让其中MENU键有效. 屏蔽andr ...

  5. android 屏蔽home键操作

    1.重写onAttachedToWindow public void onAttachedToWindow() { this.getWindow().setType(WindowManager.Lay ...

  6. 直播源码开发,Android 屏蔽返回键(后退键)

    直播源码开发,Android 屏蔽返回键(后退键) 方案一 在Activity中重写onBackPressed方法(推荐使用). @Override public void onBackPressed ...

  7. Tame your Android apps power consumption — optimize for battery life

    Ali Muzaffar Nov 210 min read Tame your Android apps power consumption - optimize for battery life W ...

  8. Android拦截短信并屏蔽Notification

    Android拦截短信并屏蔽Notification 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收" ...

  9. android模拟power按键,Android adb 模拟滑动 按键 点击事件

    模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text input keyevent input tap input swi ...

最新文章

  1. 多线程编程之死锁已经死锁产生的原因
  2. php:自定义session
  3. windows server 2008 oracle 10g,一次不太愉快的Windows Server 2008 R2 SP1上安装ORACLE 10G经历...
  4. Spring Cloud与微服务学习总结(13)——云原生趋势下,微服务的拆分粒度如何把握?
  5. 绿坝现漏洞政府天价难护航
  6. matlab逻辑符号怎么打,matlab逻辑符号
  7. 津津乐道播客网络 实习生/志愿者 招募
  8. Macbook mac 系统安装 Anaconda的方法
  9. nagios的原理及server端跟client端安装配置全部过程
  10. 数字互动沙盘解决方案
  11. VB程序界面设计经验点滴
  12. 【大数据开发】SparkSQL——RDD、DataFrame、DataSet相互转换、DSL常用方法、SQL风格语法、Spark读写操作、获取Column对象的方式
  13. 收藏的书录,值得花时间去读的书
  14. 看了这篇干货,再也不怕Mac内存不足了!
  15. 大学物理 质点运动学
  16. 用ifconfig命令,只有lo,没有eth0
  17. C语言 进制转换(1-16进制)
  18. 程序员鄙视链python_哈哈哈,程序员之间的鄙视链,总结全了!
  19. [PADS经验] 【图文并茂】教你如何使用Altium Designer画封装
  20. transform形状变化

热门文章

  1. 短信验证码测试——短信轰炸之横向轰炸和纵向轰炸
  2. 3ds模拟JAVA游戏_3ds模拟器Citra3ds下载
  3. 七日年化收益率怎么算「知识普及」
  4. Windows 10找回高性能模式和节能模式
  5. 南明区建成呼叫座席11710席
  6. MindMaster思维导图及亿图图示会员 超值获取途径
  7. 2022年湖南省临床执业医师考试第二单元精神神经系统模拟题
  8. Voucher Key 相关SELinux
  9. 快速入门开发实现订单类图片识别结果抽象解析
  10. 安全态势攻防赛事可视化,助力网络安全发展