如何拦截蓝牙耳机CALL按钮?

时间:2013-09-01 02:49:20

标签: android android-intent bluetooth android-service headset

我有一个单键蓝牙耳机(Jabra BT2045)并想截取按键按下。我希望这样,以便后台助手Service可以解释用户的语音命令并采取相应的行动。

我已经定义了一个名为BroadcastReceiver的{​​{1}}可以拦截MediaButtonIntentReceiver就好了(使用有线媒体耳机),但是我拦截BT呼叫按钮很重要。我试过拦截我读过的ACTION_MEDIA_BUTTON动作based on another suggestion,但这也失败了。

或者,当我双击按钮时,它会调用最近的人,当我长按它时会调出一个语音拨号器。

如何拦截单个按钮或这些程序(+防止它们)?黑客是受欢迎的,因为我正在构思一个想法,但无论Android版本如何工作的解决方案都是最好的。

我正在使用Android 4.3的Galaxy Nexus。

AndroidManifest.xml(包括接收者定义)

CALL_BUTTON

接收者定义:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nz.ac.waikato.ssc10.BlindAssistant">

    <uses-sdk android:minSdkVersion="17"/>

    <uses-permission android:name="android.permission.ACCESS_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- Bluetooth Headset -->
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        <activity
            android:name=".activities.VoicePromptActivity"
            android:screenOrientation="portrait"
            android:label="Voice Prompt">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <service android:name=".services.BlindAssistantService"/>
        <service android:name=".services.WalkingDirectionsUpdateService"/>

        <receiver android:name=".receivers.MediaButtonIntentReceiver">
            <intent-filter>
                <action android:name="android.intent.action.CALL_BUTTON"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

更新1:

如果我set an additional intent filter(见下文)该活动将在长按(默认设置后)启动。这似乎是我朝着正确的方向前进,但现在活动开始很多次并导致奇怪的效果。

现在我正在调查只启动活动一次,当活动恢复时,我必须能够检测它是从启动器还是从public class CallButtonIntentReceiver extends BroadcastReceiver { private static String TAG = "CallButtonIntentReceiver"; @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); // I never get to this point in debugger (breakpoint set here) // Code to actually handle button press ... } } 动作开始的。为了使这个方法有效,我需要强制执行活动只启动一次(按下按钮应该只是恢复活动)。

此外,如果可能的话,我想这样做,因此活动只是服务运行时的默认值。

VOICE_COMMAND

更新2:

不幸的是,在激活蓝牙耳机SCO通道时,不会继续创建活动。我的应用程序要求打开此频道,因为用户将接收定期更新(通过TTS),必须从BT耳机中获取。这种方法可能会产生很多开销。

1 个答案:

答案 0 :(得分:1)

您可以使用测试活动的onKeyDown方法识别耳机按钮的键码:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  Log.d("KeyCode", keycode + "");
  Log.d("KeyEvent", event + "");
  return super.onKeyDown(keyCode, event);
}

然后只需运行活动并点击耳机按钮,同时查看logcat。 您可以参考http://developer.android.com/reference/android/view/KeyEvent.html

您也可以从onKeyDown覆盖其行为,但出于明显的安全原因,我认为您不能在Activity之外监听关键事件,更不用说在服务中了。

相关问题