3

Audio-Player を作成しましたが、ユーザーが Google Voice Search を起動したときに一時停止する必要があります。

2つの方法を試しましたが、すべて失敗しました

  1. ブロードキャスト アクション インテント「android.speech.action.RECOGNIZE_SPEECH」を受信するレシーバーを作成しますが、まったく機能せず、音声検索からのコールバックを受信できません。

  2. 次のように、SpeechRecognizer を取得するサービスを作成します (私のコードの一部)。

コード:

  public class VoiceSearchMonitor extends Service
  {
      @Override
      public IBinder onBind(Intent intent)
      {
        // TODO Auto-generated method stub
        return null;
      }

      @Override
      public void onCreate()
      {
        // Get SpeechRecognizer
        SpeechRecognizer recognizer = SpeechRecognizer.createSpeechRecognizer(context);

        // Create a new RecognitionListener
        RecognitionListener listener = new RecognitionListener()
        {
           @Override
           public void onReadyForSpeech(Bundle params) 
           {
              // *** I want to pause my audio here ***
           }     

           @Override
           public void onEndOfSpeech()
           {
              // *** I want to resume my audio here ***
           }
        }

        // make an intent
        Intent intent = new Intent("android.speech.action.RECOGNIZE_SPEECH");

        // Start listening
        recognizer.setRecognitionListener(listener);
        recognizer.startListening(intent);
      }
   }

音声検索を起動した後、コールバック 'onEndOfSpeech' を受信できないためonReadyForSpeech、オーディオを一時停止する方法がありません。コールバックを正しく取得できるように、Googleの音声検索のSpeechRecognizerインスタンスを取得する方法があるのだろうか??

私の質問に対する答えを知っている人はいますか?助けてくれてありがとう!!!

喜び

4

1 に答える 1

1

この問題については、最初は同じルートをたどりましたが、解決策は SpeechRecognizer ではなく AudioManager を使用することです。

私たちのアプリは既に AudioManager.OnAudioFocusChangeListener のカスタム リスナーを使用しており、AUDIOFOCUS_GAIN および AUDIOFOCUS_LOSS 状態に正しく応答していました。音声検索が AUDIOFOCUS_LOSS_TRANSIENT 状態をトリガーすることが判明したため、それを変更リスナーに追加すると、音声検索の実行中に再生が一時停止されました。

要約する:

リスナーを作成する

AudioManager.OnAudioFocusChangeListener audioFocusListener = 
    new AudioManager.OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        Logging.d(TAG, "audiofocus change");
        if(focusChange == AudioManager.AUDIOFOCUS_LOSS || focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT)
            suspendPlayback();
        if(focusChange == AudioManager.AUDIOFOCUS_GAIN)
            resumePlayback();
    }
};

AudioManager を取得し、フォーカスをリクエストし、リスナーを渡します

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN);
于 2012-02-13T22:00:29.677 に答える