2010-10-01 10 views
1

Dans mon application android, j'appelle la reconnaissance vocale dans ma méthode onCreate de mon activité de démarrage. J'ai fait une préférence pour démarrer avec le contrôle vocal ou non. Cependant, l'application prend environ 5-7 secondes à charger lorsque la reconnaissance vocale est activée. Quand il est éteint, l'application démarre presque instantanément. Voici un exemple de code, j'ai ajouté Free_Form, max_results 1 et une invite personnalisée à extraire.L'activité Android Voice Recognition appelée dans la méthode 'onCreate' provoque le chargement lent de l'application

Intent intent = new Intent("android.speech.action.RECOGNIZE_SPEECH"); 
startActivityForResult(intent, 0); 

Alors, vraiment j'ai 2 questions:

n'est pas la course startActivity (intention) dans un thread séparé? Pourquoi l'appel de la reconnaissance vocale androïde prend-il tant de temps à se charger dans ma méthode OnCreate?

+0

« est-ce pas la course startActivity (intention) dans un fil séparé? " - Cela dépend de ce que vous utilisez. Si c'est quelque chose dans votre propre processus, alors, non, il n'est pas exécuté sur un thread séparé - tout dans votre application partage le même thread d'application principal. Je ne sais pas comment les trucs de reconnaissance vocale sont implémentés, cependant. – CommonsWare

+0

Je suppose que ce que je voulais dire était plus: 'startActivity est-il exécuté dans un thread séparé, ou est-il exécuté dans mon thread principal (ce qui bloque le chargement de mon interface utilisateur)?' Il semble que je l'appelle, il est dans mon fil de l'application principale. Merci pour le commentaire. –

Répondre

1

Vous n'attendez probablement pas que ce processus soit terminé depuis onCreate, mais plutôt lancez-le pour que le résultat revienne à un gestionnaire de rappel, ou créez un thread et lancez-le à partir de là.

+0

Je vais tenter de le lancer dans un thread séparé et/ou lancer le gestionnaire de callback implémenté, et accepter votre réponse si cela fonctionne. Merci! –

0

La configuration pour la reconnaissance vocale ne prend pas 5-7 secondes sur mon Motorola Droid, il est < 0.5 sec, donc vous pouvez avoir un autre problème avec votre code. Aucune-the-less, voici le code pour déplacer la préparation de onCreate à un fil de fond:

public class VoiceRecognition extends Activity implements OnClickListener { 

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 
ImageButton speechButton; 
static List<ResolveInfo> systemActivities=null; 
private ListView mList; 

/** 
* Called with the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Inflate our UI from its XML layout description. 
    setContentView(R.layout.voice_recognition); 

    // Get display items for later interaction 
    speechButton = (ImageButton) findViewById(R.id.btn_speak); 
    mList = (ListView) findViewById(android.R.id.list); 
    // Asynchronously activate speech recognition 
    new getSpeechTask().execute(); 
} 
private class getSpeechTask extends AsyncTask<Void,Void,List<ResolveInfo>>{ 
    protected List<ResolveInfo> doInBackground(Void...params) { 
     List<ResolveInfo> sysAct=null; 
     if(sysAct==null){ 
      PackageManager pm = getPackageManager(); 
      sysAct = pm.queryIntentActivities(
        new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0 
      ); 
     } 
     return sysAct; 
    }//doInBackground 
    protected void onPostExecute(List<ResolveInfo> result) { 
     systemActivities=result;  
     setSpeechStatus(); 
    }//apply result 
}//getSpeechTask  
void setSpeechStatus(){ 
    if(systemActivities.size()>0){ 
     speechButton.setOnClickListener(
      new OnClickListener(){ 
       @Override 
       public void onClick(View v) { 
        startVoiceRecognitionActivity(); 
       } 
      } 
     ); 
     speechButton.setEnabled(true); 
    }else{ 
     speechButton.setEnabled(false); 
    } 
} 
void startVoiceRecognitionActivity(){ 
    if(systemActivities==null){ 
     PackageManager pm = getPackageManager(); 
     systemActivities = pm.queryIntentActivities(
       new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 
     setSpeechStatus(); 
    } 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Missive(c) Speech Input"); 
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
} 

/** 
* Handle the click on the start recognition button. 
*/ 
public void onClick(View v) { 
    if (v.getId() == R.id.btn_speak) { 
     startVoiceRecognitionActivity(); 
    } 
} 


/** 
* Handle the results from the recognition activity. 
*/ 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { 
     // Fill the list view with the strings the recognizer thought it could have heard 
     ArrayList<String> matches = data.getStringArrayListExtra(
       RecognizerIntent.EXTRA_RESULTS); 
     mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
       matches)); 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 
} 

avec layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <ListView android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
    /> 
    <ImageButton android:id="@+id/btn_speak" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@android:drawable/ic_btn_speak_now" 
    /> 
</LinearLayout>