Android actividad de reconocimiento de voz llamado método 'onCreate' provoca aplicación para cargar lentamente

StackOverflow https://stackoverflow.com/questions/3841381

Pregunta

En mi aplicación para Android que llamo el reconocimiento de voz en mi método onCreate de mi actividad de inicio. He hecho una preferencia para poner en marcha con el control de voz o no. Sin embargo, la aplicación tarda unos 5-7 segundos en cargar cuando el reconocimiento de voz está activado. Cuando está apagado, la aplicación se inicia casi instantáneamente. A continuación se muestra el código de ejemplo, he añadido free_form, MAX_RESULTS 1, y un mensaje personalizado a la mía.

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

Así que en realidad tengo 2 preguntas:

No es la startActivity plazo (intención) en un hilo separado?

¿Por qué se llama el reconocimiento de habla normal androide tomar muuuy largo la carga en mi método OnCreate?

¿Fue útil?

Solución

Probablemente no esperar a completar el proceso de onCreate, en lugar lanzarlo para que el resultado va a volver a un manejador de devolución de llamada, o hacer un hilo y lanzar desde allí.

Otros consejos

La configuración de reconocimiento de voz no tardará 5-7 segundos en mi Motorola Droid, es <0,5 seg, lo que puede tener otro problema con su código. Ninguno de los de menos, aquí está el código para mover la preparación de onCreate a un subproceso de fondo:

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);
}
}

con 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top