Ref :
http://code4reference.com/2012/07/tutorial-android-voice-recognition/
main.xml 如下:
按下
speak button
會啟動voice recognition 的服務 (呼叫 speak ())
=======================================================
<LinearLayout 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:orientation="vertical" >
<EditText android:id="@+id/etTextHint" android:gravity="top" android:inputType="textMultiLine" android:lines="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/etSearchHint"/>
<Button android:id="@+id/btSpeak" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="speak"
android:text="@string/btSpeak" tools:context=".VoiceRecognitionActivity" />
<Spinner android:id="@+id/sNoOfMatches" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/saNoOfMatches" android:prompt="@string/sNoOfMatches"/>
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/tvTextMatches" android:textStyle="bold" />
<ListView android:id="@+id/lvTextMatches" android:layout_width="match_parent" android:layout_height="wrap_content" />
</LinearLayout>
========================================================================================
String.xml
========================================================================================
<string name="btSpeak">Speak</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_voice_recognition">Voice Recognition</string>
<string name="tvTextMatches">Text Matches</string>
<string name="sNoOfMatches">No of Matches</string>
<string name="etSearchHint">Speech hint here</string>
<string-array name="saNoOfMatches">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
</string-array>
========================================================================================
main.java 如下:
重點是 speak()
會啟動 ACTION_RECOGNIZE_SPEECH 服務
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//Start the Voice recognizer activity for the result.startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
最後做完會呼叫 這個 onActivityResult()...是繼承函式
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {
最後string 會放在 textMatchList 這個ArrayList裡面
========================================================================================
public class MainActivity extends AppCompatActivity {
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1001;
private EditText metTextHint;
private ListView mlvTextMatches;
private Spinner msTextMatches;
private Button mbtSpeak;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// setContentView(R.layout.activity_voice_recognition); metTextHint = (EditText) findViewById(R.id.etTextHint);
mlvTextMatches = (ListView) findViewById(R.id.lvTextMatches);
msTextMatches = (Spinner) findViewById(R.id.sNoOfMatches);
mbtSpeak = (Button) findViewById(R.id.btSpeak);
checkVoiceRecognition();
}
public void checkVoiceRecognition() {
// Check if voice recognition is present PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() == 0) {
mbtSpeak.setEnabled(false);
mbtSpeak.setText("Voice recognizer not present");
Toast.makeText(this, "Voice recognizer not present",
Toast.LENGTH_SHORT).show();
}
}
public void speak(View view) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
// Specify the calling package to identify your application intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass()
.getPackage().getName());
// Display an hint to the user about what he should say. intent.putExtra(RecognizerIntent.EXTRA_PROMPT, metTextHint.getText()
.toString());
// Given an hint to the recognizer about what the user is going to say //There are two form of language model available //1.LANGUAGE_MODEL_WEB_SEARCH : For short phrases //2.LANGUAGE_MODEL_FREE_FORM : If not sure about the words or phrases and its domain.
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
// If number of Matches is not selected then return show toast message if (msTextMatches.getSelectedItemPosition() == AdapterView.INVALID_POSITION) {
Toast.makeText(this, "Please select No. of Matches from spinner",
Toast.LENGTH_SHORT).show();
return;
}
int noOfMatches = Integer.parseInt(msTextMatches.getSelectedItem()
.toString());
// Specify how many results you want to receive. The results will be // sorted where the first result is the one with higher confidence. intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, noOfMatches);
//Start the Voice recognizer activity for the result. startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE)
//If Voice recognition is successful then it returns RESULT_OK if(resultCode == RESULT_OK) {
// 把data 從 voice recognition 中取出來
ArrayList<String> textMatchList = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (!textMatchList.isEmpty()) {
// If first Match contains the 'search' word // Then start web search. if (textMatchList.get(0).contains("search")) {
String searchQuery = textMatchList.get(0);
searchQuery = searchQuery.replace("search","");
Intent search = new Intent(Intent.ACTION_WEB_SEARCH);
search.putExtra(SearchManager.QUERY, searchQuery);
startActivity(search);
} else {
// populate the Matches mlvTextMatches .setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
textMatchList));
}
}
//Result code for various error. }else if(resultCode == RecognizerIntent.RESULT_AUDIO_ERROR){
showToastMessage("Audio Error");
}else if(resultCode == RecognizerIntent.RESULT_CLIENT_ERROR){
showToastMessage("Client Error");
}else if(resultCode == RecognizerIntent.RESULT_NETWORK_ERROR){
showToastMessage("Network Error");
}else if(resultCode == RecognizerIntent.RESULT_NO_MATCH){
showToastMessage("No Match");
}else if(resultCode == RecognizerIntent.RESULT_SERVER_ERROR){
showToastMessage("Server Error");
}
super.onActivityResult(requestCode, resultCode, data);
}
void showToastMessage(String message){
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}