2015-08-13 4 views
5

Tout ce que vous devez savoir: J'ai un dialogue avec un bouton dedans. Lorsque le bouton est pressé, je veux démarrer la reconnaissance vocale dans ma MainActivity. (Le dialogue est créé par une autre classe, je gère les clics via une interface).Reconnaissance vocale Android: startActivityForResult() ne fonctionne pas

Voici donc le code correspondant: (en MainActivity)

public void speechToText(boolean isName) { 

    this.isName = isName; 

    Intent intent = new Intent(
      RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 

    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().toString()); 
    //intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.prompt)); 

    try { 
     startActivityForResult(intent, RESULT_SPEECH); 

     Toast.makeText(getApplicationContext(), 
       "started acitvity for result",  //test toast 
       Toast.LENGTH_SHORT).show(); 

    } catch (ActivityNotFoundException a) { 
     Toast.makeText(getApplicationContext(), 
       getString(R.string.speech_to_text_not_supported), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
     case RESULT_SPEECH: { 
      if (resultCode == RESULT_OK && null != data) { 

       ArrayList<String> text = data 
         .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

       if(isName) 
        currentName = text.get(0); 
       else 
        currentDes = text.get(0); 

       dialog.DialogNew(currentName, currentDes); 
      } 
      break; 
     } 

    } 
} 

Voici le problème: Normalement, une boîte de dialogue apparaît pour l'entrée de la parole. Mais en quelque sorte cette boîte de dialogue n'apparaîtra pas. Je l'ai testé, et il montre le 'test toast' (voir ci-dessus), mais il n'y a pas d'erreur et pas de dialogue de saisie. Mais pourquoi?

Editer: J'ai finalement pu le tester sur un autre appareil et (enfin) j'ai eu une erreur: la boîte de dialogue google était fermée. Du protocole, une exception de pointeur nul, donc je suppose qu'il doit y avoir quelque chose de mal avec mon intention.

+0

Vous devez vérifier logcat pour plus de détails, les détails d'erreur devraient apparaître là. Malheureusement, le code que vous avez fourni n'est pas suffisant. Il se peut que vous commenciez cette activité à partir d'un autre thread, vous devriez le démarrer à partir d'un thread principal. –

+0

Aucune erreur dans logcat. J'ai seulement une activité (dans laquelle j'appelle le startActivityForResult (...)). Comme je l'ai dit, j'appelle speechToText() à partir d'une boîte de dialogue. Je pensais qu'il y aurait un problème, donc j'ai essayé de le rejeter avant que j'appelle la méthode, mais cela n'aide pas – kfx9

Répondre

1

Je pouvais enfin résoudre le problème:

Dans mon manifast:

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:theme="@style/AppTheme" 
     android:uiOptions="none" > 
     android:launchMode="singleInstance"> <!--THIS WON'T WORK--> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

D'une certaine façon, vous ne pouvez pas utiliser SingleInstance comme mode de lancement de l'activité. Pour mon but, j'ai utilisé singleTask comme alternative.

0

Je crois que vous devez également ceci:

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 

listes de documentation Android cette sous la rubrique "Extras nécessaires" pour connaître RecognizerIntent.

EDIT: Après expérimentation cependant, il semble que EXTRA_LANGUAGE_MODEL n'est pas obligatoire dans l'intention, contrairement à la documentation. La reconnaissance fonctionne sans elle, au moins dans mon test ...

+0

Sry Je ne suis pas actuellement à la maison, mais je le vérifie dès que possible :). J'ai d'abord ignoré cette réponse, parce que j'ai utilisé exactement ces méthodes dans une autre application (dans laquelle je ne l'appelle pas à partir d'une boîte de dialogue) dans laquelle cela a fonctionné. – kfx9

+0

Non, ne fonctionne pas ... – kfx9

+0

Hmmm. Eh bien, j'ai pris votre code, emballé dans un squelette d'application par défaut, résolu les quelques variables de classe non déclarées, et cela fonctionne très bien pour moi. Je reçois la reconnaissance. Oui, même sans "EXTRA_LANGUAGE_MODEL". – spechter