我有一个单按钮蓝牙耳机(Jabra BT2045),想拦截按钮按下。我想要这个,以便后台助手Service
可以解释用户的语音命令并采取相应的行动。
我已经定义了一个可以很好地拦截的BroadcastReceiver
命名(使用有线媒体耳机),但重要的是我拦截了 BT 呼叫按钮。我曾尝试根据我已阅读的另一个建议拦截该操作,但这也失败了。MediaButtonIntentReceiver
ACTION_MEDIA_BUTTON
CALL_BUTTON
或者,当我双击按钮时,它会呼叫最近的人,当我长按时,它会调出语音拨号器。
如何拦截单个按钮或这些程序(+阻止它们)?由于我正在对一个想法进行原型设计,因此欢迎黑客攻击,但无论 Android 版本如何都能工作的解决方案是最好的。
我正在使用带有 Android 4.3 的 Galaxy Nexus。
AndroidManifest.xml(包括接收器定义)
<?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>
接收器定义:
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 ...
}
}
更新1:
如果我为活动设置了一个额外的意图过滤器(见下文),它将在长按时启动(在将其设置为默认值之后)。这似乎我正朝着正确的方向前进,但现在活动开始多次并导致奇怪的影响。
现在我正在调查只启动一次活动,当活动恢复时,我必须能够检测它是从启动器启动还是从VOICE_COMMAND
操作启动。为了使这种方法起作用,我需要强制该活动只启动一次(按下按钮应该只是恢复活动)。
此外,如果可能的话,我想让它成为服务运行时的默认活动。
<intent-filter>
<action android:name="android.intent.action.VOICE_COMMAND"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
更新 2:
不幸的是,当蓝牙耳机 SCO 通道被激活时,将不会继续创建活动。我的应用程序要求打开此通道,因为用户将收到必须来自 BT 耳机的定期更新(通过 TTS)。这种方法可能会产生很多开销。