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