【问题标题】:How to capture key events inside a service?如何捕获服务中的关键事件?
【发布时间】:2010-07-12 15:51:59
【问题描述】:

我希望能够在我正在编写的服务中捕获关键事件。我可以在活动中毫无问题地做到这一点,但我所有试图让它在服务中工作的尝试都失败了。我想(全局)捕获的键是 BACK 按钮,但如果这不可能,HTC Desire 提供的任何(硬件)按钮都可以。

【问题讨论】:

  • 为什么要在Service 中捕获它?
  • 首先:我是 android 编程新手,我认为活动只有在获得焦点时才会接收 KeyEvents。如果不是这种情况,我并不严格需要服务。我想做的是编写一个应用程序,可以在拨打电话时停用接近传感器激活的屏幕锁定。这是必要的,因为 HTC Desire 有时会“忘记”正确地重新启用屏幕我想在按下任何按钮时执行此操作(以便能够挂断而无需卸下电池;))。

标签: android


【解决方案1】:

服务没有 UI,因此它不会接收来自用户的任何输入。

现在,如果您有一个管理该服务的 Activity,那么您可以在您的 Activity 中按下返回键时让该服务执行一些特殊操作。

【讨论】:

    【解决方案2】:

    您可以通过无障碍服务捕获硬件按键事件,只需在安装应用程序后进入无障碍设置启用该服务即可。这是代码

        public class AccessiblityService extends AccessibilityService {
    
            @Override
            protected void onServiceConnected() {
                super.onServiceConnected();
                Log.d(TAG, "service is connected");
            }
    
            @Override
            public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    
                Log.d(TAG, "onAccessibiltyEvent" + accessibilityEvent.toString());
    
            }
    
            @Override
            public void onInterrupt() {
    
            }
        // here you can intercept the keyevent
            @Override
            protected boolean onKeyEvent(KeyEvent event) {
                return handleKeyEvent(event);
            }
    
             private boolean handleKeyEvent(KeyEvent event) {
                int action = event.getAction();
                int keyCode = event.getKeyCode();
                if (action == KeyEvent.ACTION_DOWN) {
                    switch (keyCode) {
                        case KeyEvent.KEYCODE_VOLUME_DOWN:
                            //do something
                            return true;
    
                        case KeyEvent.KEYCODE_VOLUME_UP: {
                            //do something
                            return true;
                        }
                    }
                }
                return false;
            }
    
    } 
    

    ma​​nifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.mypackagename">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:ignore="GoogleAppIndexingWarning">
            <service
                android:name=".AccessiblityService"
                android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
                <intent-filter>
                    <action android:name="android.accessibilityservice.AccessibilityService" />
                </intent-filter>
                <meta-data
                    android:name="android.accessibilityservice"
                    android:resource="@xml/accessibility_service" />
            </service>
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>             
        </application>
    
    </manifest>
    

    accessibility_service.xml //在“xml”目录下创建

    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:canRequestFilterKeyEvents="true"
        android:accessibilityFlags="flagRequestFilterKeyEvents"/>
    

    【讨论】:

    【解决方案3】:

    是的,Android 的活动只有在获得焦点时才会收到KeyEvents

    “全局”捕获后退按钮按下的唯一方法是创建InputMethod,以便您可以拦截硬键事件。 请记住,使用您自己的 InputMethod 将不允许您使用自定义键盘,例如 Swiftkey

    您是否尝试就这个问题联系 HTC?

    【讨论】:

    • 这不是我的设备(我有一个三星 Galaxy I9000 - 它有它自己的问题;))而是我的一个朋友。他搜索了一些论坛,发现有些人有同样的问题,但到目前为止没有解决方案(我不知道他是否联系了HTC)。但是在 Android 开放之后,我们应该能够解决我们遇到的问题(所以我想),这个想法就是这样做的。 ;)
    【解决方案4】:

    您可以从框架广播 keyEvent 并在您的服务中处理广播。 但是您需要为此更改框架中的代码。

    【讨论】:

      【解决方案5】:

      如果您只想捕捉改变音量的事件而不管音量按钮是否被按下,这个答案会有所帮助。

      any way to detect volume key presses or volume changes with android service?

      【讨论】:

        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 2022-10-17
        • 2011-08-27
        • 2011-11-22
        • 2013-06-21
        • 1970-01-01
        • 2020-08-31
        相关资源
        最近更新 更多