我正在开发一个Android应用程序,其中可以通过语音控制设置一些内容,但是我想使用连续的语音监听器使其触发助手,因此无需按下按钮即可开始监听,但我不知道该怎么做。这部分与按钮按下完美配合。我的代码适用于侦听器:
private void initializeSpeechRecognizer() {
if (SpeechRecognizer.isRecognitionAvailable(this)) {
speechRecog = SpeechRecognizer.createSpeechRecognizer(this);
speechRecog.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
@Override
public void onResults(Bundle results) {
List<String> result_arr =
results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
try {
processResult(result_arr.get(0));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
});
}
}
private int getSetFlow(String voiceStr) {
int i = 0, value = -33133;
Boolean isNumberStart = false, isNegative = false;
int cValue;
if (voiceStr.contains( "set 2 " ))
i = 6;
for (; i < voiceStr.length(); i++) {
if (voiceStr.charAt( i ) >= '0' && voiceStr.charAt( i ) <= '9') {
if (isNumberStart == false)
value = 0;
if (i > 2)
if (voiceStr.charAt( i - 2 ) == '-')
isNegative = true;
cValue = voiceStr.charAt( i );
isNumberStart = true;
value = value * 10 + cValue - 48;
} else if (value != -33133)
break;
}
return isNumberStart ? (isNegative ? -value : value) : -33133;
}
private int setValue;
private void processResult(String result_message) throws IOException {
result_message = result_message.toLowerCase();
if (result_message.contains( "start" )) {
speak( "Measurement started" );
if (BTinit()) {
if (BTconnect()) {
setUiEnabled( true );
deviceConnected = true;
beginListenForData();
//textView.append("\nConnection Opened!\n");
textView.setText( "\nConnection Opened!\n" );
sendTimerIsRunning = true;
tmrSendData = new Timer();
tmrSendData.schedule( new SendTask(), 250 );
FrameLayout framespinner = findViewById( R.id.framespinner );
framespinner.setVisibility( View.INVISIBLE );
}
}
} else if (result_message.contains( "stop" )) {
speak( "Measurement stopped" );
stopThread = true;
outputStream.close();
inputStream.close();
socket.close();
setUiEnabled( false );
deviceConnected = false;
//textView.append("Connection Closed!\n");
textView.setText( "Connection Closed!\n" );
sendTimerIsRunning = false;
FrameLayout framespinner = findViewById( R.id.framespinner );
framespinner.setVisibility( View.VISIBLE );
} else if (result_message.contains( "clear" )) {
speak( "Measurement data cleared" );
textView.setText( "" );
cntLines = 0;
//lastX = 0;
if (series != null) {
series.resetData( new DataPoint[]{new DataPoint( lastX, flow )} );
}
if (series2 != null) {
series2.resetData( new DataPoint[]{new DataPoint( lastX, temp )} );
}
if (series3 != null) {
series3.resetData( new DataPoint[]{new DataPoint( lastX, press )} );
}
} else if (result_message.contains( "set" )) {
setValue = getSetFlow(result_message);
if(setValue != -33133) {
if(setValue<0)
speak( "Negative values not supported" );
else
speak( "Flow set to" + setValue );
}
seekBar1.setProgress( Integer.parseInt( String.valueOf( setValue ) ) );
setFlow.setText( String.valueOf( seekBar1.getProgress() ) );
}
else if (result_message.contains( "exit" )) {
speak( "Exited" );
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
}
private void initializeTextToSpeech() {
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (tts.getEngines().size() == 0 ){
Toast.makeText(HomeActivity.this,
getString(R.string.tts_no_engines),Toast.LENGTH_LONG).show();
finish();
} else {
tts.setLanguage( Locale.getDefault());
}
}
});
}
private void speak(String message) {
if(Build.VERSION.SDK_INT >= 21){
tts.speak(message,TextToSpeech.QUEUE_FLUSH,null,null);
} else {
tts.speak(message, TextToSpeech.QUEUE_FLUSH,null);
}
}