2013-09-01 49 views
3

我有一個單鍵藍牙耳機(捷波朗BT2045),並想攔截按鈕按下。我想這樣做,以便後臺助理Service可以解釋用戶的語音命令並採取相應的行動。如何攔截藍牙耳機CALL按鈕?

我已經定義了一個名爲MediaButtonIntentReceiverBroadcastReceiver,它可以很好地攔截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耳機出來。這種方法可能會產生很多開銷。

回答

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以外的關鍵事件,更不用說在Service中出於安全原因。

+0

不幸的是,這是針對沒有定義onKeyDown()的服務。我希望有一種入侵或方法可以跳入並假裝我是語音撥號器(我可能找到了一個半解決方案,將編輯第一篇文章) –