문제

In my android app I call the voice recognition in my onCreate method of my startup activity. I have made it a preference to start up with the voice control or not. However, the app takes about 5-7 seconds to load when voice recognition is on. When it is off, the app starts almost instantly. Below is sample code, I have added Free_Form, max_results 1, and a custom prompt to mine.

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

So really I have 2 questions:

Isn't the startActivity(intent) run in a separate thread?

Why would calling the normal android speech recognition take sooo long to load in my OnCreate method?

도움이 되었습니까?

해결책

You probably don't wait to complete that process from onCreate, instead launch it so that the result will come back to a callback handler, or make a thread and launch it from there.

다른 팁

The setup for voice recognition does not take 5-7 seconds on my Motorola Droid, it is <0.5 sec, so you may have another issue with your code. None-the-less, here is code for moving the preparation from onCreate to a background thread:

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

with 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top