Android obtient l’intention lors de l’implémentation de RecognitionListener

Comme indiqué dans cette réponse par Iftah, je peux obtenir l’audio enregistré par la reconnaissance vocale dans Android en obtenant le Uri de l’intention à:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // the recording url is in getData: Uri audioUri = data.getData(); } 

Ici, les Intent data ont exactement ce que je veux sans problèmes.

Que tout fonctionne parfaitement, mais cette solution met en place une invite pour l’utilisateur de quand parler, je ne voulais pas que ce soit ainsi que je laisse mon activité implémenter RecognitionListener comme tel:

 public class MainActivity extends AppCompatActivity implements RecognitionListener { private SpeechRecognizer speech = null; private Intent recognizerIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "sv_SE"); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "sv_SE"); recognizerIntent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR"); recognizerIntent.putExtra("android.speech.extra.GET_AUDIO", true); speech = SpeechRecognizer.createSpeechRecognizer(this); speech.setRecognitionListener(this); speech.startListening(recognizerIntent); } @Override public void onReadyForSpeech(Bundle params) { Log.d("Debug", "On ready for speech"); } @Override public void onBeginningOfSpeech() { Log.d("Debug", "On beggining of speech"); } @Override public void onRmsChanged(float rmsdB) { Log.d("Debug", "Rsm changed"); } @Override public void onBufferReceived(byte[] buffer) { Log.d("Debug", "Buffer recieved"); } @Override public void onEndOfSpeech() { Log.d("Debug", "On end of speech"); } @Override public void onError(int error) { Log.d("Debug", "Error"); } @Override public void onPartialResults(Bundle partialResults) { Log.d("Debug", "On partial result"); } @Override public void onEvent(int eventType, Bundle params) { Log.d("Debug", "On event"); } @Override public void onResults(Bundle results) { Log.d("Debug", "On result"); } } 

Cela permet de contourner le problème rapidement, je ne peux pas comprendre comment obtenir le Uri comme dans le premier exemple, car ici:

 @Override public void onResults(Bundle results) { Log.d("Debug", "On result"); // The results bundle don't contain the URI! } 

Je reçois un Bundle results qui ne contiennent pas l’intention ni l’Uri. J’ai essayé de regarder toutes les clés dans le bundle et aucun URI ou Intent n’existe, j’ai aussi essayé getIntent() mais cela ne renvoie rien.

J’apprécie toute aide ou pousser dans la bonne direction.

Les résultats doivent être dans le bundle avec la clé SpeechRecognizer.RESULTS_RECOGNITION .

 @Override public void onResults(Bundle results) { if (results != null && results.containsKey(SpeechRecognizer.RESULTS_RECOGNITION)) { List resultsList = results.getSsortingngArrayList(SpeechRecognizer.RESULTS_RECOGNITION); // most likely result is resultsList.get(0) } else { // no results } } 

Voir la documentation du développeur Android pour SpeechRecognizer l’explique en détail. Cette méthode d’obtention des résultats de la reconnaissance vocale fonctionne également pour des résultats partiels dans #onPartialResults