我有一個單鍵藍牙耳機(捷波朗BT2045),並想攔截按鈕按下。我想這樣做,以便後臺助理Service
可以解釋用戶的語音命令並採取相應的行動。如何攔截藍牙耳機CALL按鈕?
我已經定義了一個名爲MediaButtonIntentReceiver
的BroadcastReceiver
,它可以很好地攔截ACTION_MEDIA_BUTTON
(使用有線媒體耳機),但重要的是我攔截了BT呼叫按鈕。我已經嘗試攔截CALL_BUTTON
動作based on another suggestion我已閱讀,但這也失敗。
或者,當我雙擊按鈕時,它會調用最近的人,當我長時間按下它時,會調出語音撥號程序。
如何截取單個按鈕或這些程序(+防止它們)?因爲我正在構想一個想法,所以我很歡迎黑客,但是不管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:
如果我set an additional intent filter(見下文)爲acti vity它會長時間啓動(將其設置爲默認設置後)。這看起來好像我正朝着正確的方向發展,但現在這項活動開始了很多次,並造成了奇怪的效果。
現在我正在調查一次只啓動一次活動,當活動恢復時,我必須能夠檢測它是從啓動器還是從VOICE_COMMAND
操作開始。爲了使這種方法起作用,我需要強制執行活動只開始一次(按下按鈕應該簡單地恢復活動)。
此外,如果可能,我想使它成爲活動只是服務運行時的默認值。
<intent-filter>
<action android:name="android.intent.action.VOICE_COMMAND"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
更新2:
不幸的是,該活動將不會同時藍牙耳機SCO通道被激活,繼續創建。我的應用程序要求此頻道開放,因爲用戶將收到定期更新(通過TTS),必須從BT耳機出來。這種方法可能會產生很多開銷。
不幸的是,這是針對沒有定義onKeyDown()的服務。我希望有一種入侵或方法可以跳入並假裝我是語音撥號器(我可能找到了一個半解決方案,將編輯第一篇文章) –