2012-08-02 77 views
1

我使用的是來自newboston的這個例子,它提示我進行錄製,但在識別出我所說的內容之後,它不會更新列表視圖。Android語音識別不起作用

這是代碼。

public class MainActivity extends Activity { 

private static final int RECOGNIZER_RESULT = 1234; 
ListView list; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    list = (ListView) findViewById(R.id.list); 

    Button btn_speach = (Button)findViewById(R.id.btn_speak); 
    btn_speach.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
      intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech to search"); 
      startActivityForResult(intent, RECOGNIZER_RESULT); 

     } 
    }); 
} 



@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if(requestCode == RECOGNIZER_RESULT && requestCode == RESULT_OK){ 
     ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
     list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches)); 
     for(int i = 0; i < matches.size(); i++){ 
      Log.i("MainActivity", matches.get(i)); 
     } 
    } 

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



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 
} 

這裏是xml佈局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <Button 
     android:id="@+id/btn_speak" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="Button" /> 

    <ListView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/button1" > 

    </ListView> 

</RelativeLayout> 

我沒有得到任何錯誤。而下面的代碼也不會在LogCat中打印任何內容。

for(int i = 0; i < matches.size(); i++){ 
      Log.i("MainActivity", matches.get(i)); 
} 

而我測試我的Android設備上有語音識別功能。

+0

這裏希望這個博客將幫助您在工程深入到語音識別問題http://blog.contus.com/how-to-implement-the-voice-recognition-functionality-in-android-devices/ – 2014-07-31 10:11:02

回答

0

你可以試試這個代碼..它在我的應用程序運行......

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.speech.RecognizerIntent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    Button speak; 
    ListView options; 
    ArrayList<String> results; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //doctory endsl... 
     speak = (Button) findViewById(R.id.bSpeak); 
     options = (ListView) findViewById(R.id.lvOptions); 

     speak.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      { 
       // This are the intents needed to start the Voice recognizer 
       Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
       // i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
        // RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
       i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); 
       i.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 15); // number of maximum results.. 
       i.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say something"); 

       startActivityForResult(i, 1010); 
      } 
     }); 

     // retrieves data from the previous state. This is incase the phones 
     // orientation changes 
     if (savedInstanceState != null) { 
      results = savedInstanceState.getStringArrayList("results"); 


      if (results != null) { 
       options.setAdapter(new ArrayAdapter<String>(this, 
         android.R.layout.simple_list_item_1, results)); 
      } 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     // retrieves data from the VoiceRecognizer 
     if (requestCode == 1010 && resultCode == RESULT_OK) { 
      results = data 
        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

      if (results.contains("close")) 
      { 
       finish(); 
      }//extra testing... 
      options.setAdapter(new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, (results)); 
     } 

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

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     // This should save all the data so that when the phone changes 
     // orientation the data is saved 
     super.onSaveInstanceState(outState); 

     outState.putStringArrayList("results", results); 
    } 

} 

和XML是...

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<ListView 
    android:id="@+id/lvOptions" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/button1" > 
</ListView> 

<Button 
    android:id="@+id/bSpeak" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:text="Speak" />