【问题标题】:How to capture app switch key using onKeyDown in Android?如何在 Android 中使用 onKeyDown 捕获应用程序切换键?
【发布时间】:2011-12-20 17:59:02
【问题描述】:

我正在尝试在 android 3.1 和 4.0 上捕获应用切换键和主页键,但它似乎不起作用。

这就是我正在做的事情

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
   if (KeyCode == KeyEvent.KEYCODE.KEYCODE_APP_SWITCH && event.getRepeatCount() == 0)
    { 
        Log.d ("onkeydown","app switch key");
    }
   else if (KeyCode == KeyEvent.KEYCODE.KEYCODE_HOME && event.getRepeatCount() == 0)
    { 
        Log.d ("onkeydown","home key");
    }
    //EDIT:
    return super.onKeyDown(keyCode, event);
}

我的 log.d 语句没有打印出来。是否可以捕获这两个键?

使用正确的返回语句更新代码

【问题讨论】:

    标签: android onkeydown


    【解决方案1】:

    嗯。

    嗯,不,你不能。

    public static final int KEYCODE_HOME

    自:API 级别 1

    键码常量:Home键。

    此密钥由框架处理,永远不会传递给应用程序。

    http://developer.android.com/reference/android/view/KeyEvent.html

    【讨论】:

    • KEYCODE_APP_SWITCH 怎么样。为什么这个没有被捕获?
    • 我会假设 Home Activity 或操作系统框架已捕获该键,您无法接收到该事件。毕竟,它宁愿违背拥有这样一把钥匙的目的。
    • 它烦人...onkeydown 甚至没有调用 app_switch 被按下:(
    【解决方案2】:

    可以使用反射来实现。

    它在android.os.ServiceManager 类下,有一个辅助com.android.internal.statusbar.IStatusBarService,它包含toggleRecentApps 方法

    也可以试试这个method here

    【讨论】:

      【解决方案3】:

      super.onKeyDown(keyCode, event) 不见了,我想你应该试试这个:

      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event)
      {
      super.onKeyDown(keyCode, event);
      
         if (KeyCode == KeyEvent.KEYCODE.KEYCODE_APP_SWITCH && event.getRepeatCount() == 0)
          { 
              Log.d ("onkeydown","app switch key");
          }
         else if (KeyCode == KeyEvent.KEYCODE.KEYCODE_HOME && event.getRepeatCount() == 0)
          { 
              Log.d ("onkeydown","home key");
          }
          return true;
      }
      

      使用 switch 语句做同样的事情:

      @Override
          public boolean onKeyDown(int keyCode, KeyEvent event) {
          super.onKeyDown(keyCode, event);
              switch(keyCode)
              {
                  case KeyEvent.KEYCODE_CAMERA:
                   Toast.makeText(ListViewActivity.this, "Pressed Camera Button", Toast.LENGTH_SHORT).show();
                      return true;
                  case KeyEvent.KEYCODE_1:
                   Toast.makeText(ListViewActivity.this, "Pressed 1", Toast.LENGTH_SHORT).show();
                      return true;
                  case KeyEvent.KEYCODE_HOME:
                   Toast.makeText(ListViewActivity.this, "Pressed Home Button", Toast.LENGTH_SHORT).show();
                      return true;
      
                  case KeyEvent.KEYCODE_BACK:
                   Toast.makeText(ListViewActivity.this, "Pressed Back Button", Toast.LENGTH_SHORT).show();
                      finish();
                      return true;
              }
      
              return false;
          }
      

      【讨论】:

      • 我试过 super.onKeyDown(keyCode, event)。结果相同。当我按下应用程序开关键 onkeydown 未被调用时,这是一些有趣的事情。我有一个断点...嗯
      • 你能提供更多示例代码吗,我猜你可能遗漏了一些东西。
      • 不,我刚刚用正确的返回语句更新了原始帖子...这是我的示例代码
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 2011-01-28
      • 2011-01-22
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多