在后台长按硬件媒体按钮

Listen to hardware media button longpress in background

即使设备已锁定或应用程序处于后台,我也需要捕获媒体按钮的长按事件。 onKey 侦听器不适用于后台应用程序。我有一个 BroadcastReceiver 的工作示例,但它只适用于短按。我正在使用 AudioManager 来注册接收器。当我长时间按下按钮时,我在控制台中看到的是:

I/MediaSessionService(684):基于语音的交互:即将使用 ACTION_WEB_SEARCH

I/ActivityManager(684): 从 uid 1000 开始 u0 {act=android.speech.action.WEB_SEARCH flg=0x10800000} 显示 0

所以我尝试通过 context.registerReceiver() 方法收听 ACTION_WEB_SEARCH 但没有成功。我还将带有 intent-filter 的接收器添加到清单文件中。

我还有其他方法可以尝试吗?或者有人知道可行的解决方案吗?我已经搜索和测试这个功能 5 天了,我真的很生气。 =D

我找到了与您在此处描述的问题完全相同的答案。

您需要做的就是将 intent-filter 添加到您想要通过长按媒体按钮启动的activity。

WEB_SEARCH解锁时调用

VOICE_SEARCH_HANDS_FREE锁屏时调用

向 Main 添加了操作的清单文件Activity:

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
        <intent-filter android:priority="1000000">
            <action android:name="android.speech.action.VOICE_SEARCH_HANDS_FREE" />
            <action android:name="android.speech.action.WEB_SEARCH" />
            <category android:name="android.intent.category.DEFAULT" />

            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

第一次启动应用程序并长按按钮时,屏幕底部会出现一个小对话框。该对话框询问您是要使用 Google 应用程序还是您自己的应用程序完成操作,它们都监听相同的操作。

不要忘记将此添加到您的 Activity 中,否则它不会显示在您的锁屏上。

@Override
public void onAttachedToWindow() {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}