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>
« 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
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. –