zoukankan      html  css  js  c++  java
  • Android 屏蔽Power键 Home键

    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?在CODE上查看代码片派生到我的代码片

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

    [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

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

    [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

    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?在CODE上查看代码片派生到我的代码片

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

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

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

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

    [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

    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 ,

    文件位置:frameworksasepolicysrccomandroidinternalpolicyimpl

    这里我们重点关注:public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) 这个方法,这里对Home键,Power键做了处理,使得我们在应用程序中无法获得两个键的键值,即使通过各种方法获得了键值,也无法屏蔽该功能。因此,决定将部分逻辑放在这个文件中处理。在方法中找到Power键对应的case,添加我的处理逻辑。

    [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

    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?在CODE上查看代码片派生到我的代码片

    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

  • 相关阅读:
    CompletableFuture详解1
    使用CompletionService解决耗时时间过长任务导致的阻塞问题以及解决ExecutorService.shutdownNow()导致正在执行中的任务被打断,但该任务不会被返回
    ScheduledExecutorService和ScheduledThreadPoolExecutor
    future的缺陷和CompletionService对他的优化
    Future方法详解
    ExecutorService的API详解
    scheduler的前奏Timer&Crontab和Quartz的比较
    [Paper Reading]--Exploiting Relevance Feedback in Knowledge Graph
    [Leetcode] DP-- 96. Unique Binary Search Trees
    [Leetcode] DP-- 474. Ones and Zeroes
  • 原文地址:https://www.cnblogs.com/cute/p/4980099.html
Copyright © 2011-2022 走看看