Android 屏蔽Power键 Home键
2014-04-18 17:22
387 查看
最近正在处理工厂测试的功能,里面有个功能测试是前面板按键功能测试。需求中要求:在按每个前面板按键时,要修改UI中每个对应按键的颜色。其中有两个键Home键,和Power键,程序需要对这两个按键进行拦截,网上查了一些资料,现归纳一下常用的几种方式。
测试结果:2.3之前的版本没有去测试,在手中4.0版本中,程序无法运行。出错打印:
与重写onAttachedToWindow方法有关,没有再去调试,放弃该方法。
文件位置:frameworks\base\policy\src\com\android\internal\policy\impl
这里我们重点关注:public
int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) 这个方法,这里对Home键,Power键做了处理,使得我们在应用程序中无法获得两个键的键值,即使通过各种方法获得了键值,也无法屏蔽该功能。因此,决定将部分逻辑放在这个文件中处理。在方法中找到Power键对应的case,添加我的处理逻辑。
编译镜像,烧录镜像。好的,镜像完成了,下面就是测试修改的效果了。写一个测试程序。
此时,我们在接收到广播后,就可以处理自己的业务逻辑了。
参考内容:http://blog.csdn.net/myarrow/article/details/8143717
http://blog.csdn.net/goleftgoright/article/details/7756111
第一种方式:android 对home键的监听(针对2.3以前的版本有效)
1.在manifes文件中添加权限
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
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
相关文章推荐
- Android如何屏蔽home键和recent键
- Android 屏蔽Power键 Home键
- 关于android 锁屏应用屏蔽home键的总结
- android home键屏蔽
- Android5.1 屏蔽下拉框以及屏蔽HOME键功能
- android Home键 屏蔽,捕获,修改
- Android 屏蔽Home键(2.2、2.3/4.0以上)
- android 障蔽Home键, 屏蔽BACK键,MENU键
- Android屏蔽Home键、屏蔽下拉菜单最有效的办法(部分手机无效)
- Android中屏蔽 电源键长按、Home键、Home长按
- android4.2 屏蔽home键
- Android 屏蔽Power键 Home键
- android 4.0 屏蔽home键实现
- Android 4.0以后屏蔽Home键和返回键
- Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
- Android 屏蔽返回键、菜单键和Home键
- Android HOME键的屏蔽. 同事小伟 提供
- 【Android】Android中屏蔽返回键,home键以及其他实体按键
- Android 屏蔽Home键
- Android实现对HOME键的捕获和屏蔽