Android actividad de reconocimiento de voz llamado método 'onCreate' provoca aplicación para cargar lentamente
-
27-09-2019 - |
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?
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>