Надеюсь, я буду достаточно ясным.Быстрое распознавание голоса изнутри onActivityResult в Android
В моем приложении я установил его так, чтобы нажатие кнопки «Назад» активировало службу распознавания голоса Google. В onActivityResult
он проверяет, является ли первое слово «вызовом» или «текстом», и действуйте соответственно с остальной частью произнесенного предложения. Для текста в частности это похоже на «текст [контактное имя] сообщение [содержимое сообщения]», а затем отправляет его с помощью smsManager
. Но так как это может привести к неправильному названию или сообщению, я хочу, чтобы он сначала зачитал сообщение и имя человека для подтверждения, которое я сделал просто отлично.
Проблема заключается в том, чтобы подтвердить или отменить, я хочу также использовать распознавание голоса. Если после того, как сообщение будет считано, пользователь произнесет что-то вроде отправки, и только тогда он должен продолжить отправку сообщения. Итак, что мне нужно знать, как/если я могу это реализовать (newVoiceCommand
) в коде ниже:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_SPEECH: {
if (resultCode == RESULT_OK && null != data) {
s="";
text = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
decide = text.get(0).split("\\s");
for (int i=1; i<decide.length;i++) s= s+decide[i] + " ";
if (decide [0].equals("text")){
if (!s.equals("")){
msg = s.split(" message");
char[] stringArray = msg[0].toCharArray();
stringArray[0] = Character.toUpperCase(stringArray[0]);
msg[0] = new String(stringArray);
contact = get_Number (test(msg[0]));
Intent intent = getIntent();
finish();
startActivity(intent);
String temp = "Are you sure you want to send " + msg[1] + " to " + test(msg[0]);
speakOut (temp);
if (newVoiceCommand.equals("send")){
try {
SmsManager smsManager = SmsManager.getDefault();
out.append(contact);
smsManager.sendTextMessage(contact, null, msg[1], null, null);
Toast.makeText(getApplicationContext(), "SMS Sent! to "+msg[0] + " at " +contact,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
"SMS faild, please try again later!",
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
else if (newVoiceCommand.equals("no")) out.append("Not sending");
}
}
else if (decide[0].equals("call")){
out.append (s);
if (!s.equals("")) {
call (s);
}
}
}
break;
}
}
}
Моя текущая попытка:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_SPEECH: {
if (resultCode == RESULT_OK && null != data) {
s="";
//Grab the speech results and save them in an arraylist
text = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
//Split each word into an array item
decide = text.get(0).split("\\s");
//Re-concatenate the words starting with the second word together
for (int i=1; i<decide.length;i++) s= s+decide[i] + " ";
//If the first word is "text", then send an SMS using the rest of the information spoken
if (decide [0].equals("text")){
if (!s.equals("")){
check (s);
Intent spIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
spIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en_US");
try {
startActivityForResult(spIntent, RESULT_SPEECH2);
} catch (ActivityNotFoundException a) {
Toast t = Toast.makeText(getApplicationContext(),
"Opps! Your device doesn't support Speech to Text",
Toast.LENGTH_SHORT);
t.show();
}
switch (requestCode) {
case RESULT_SPEECH2: {
if (resultCode == RESULT_OK && null != data) {
text2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
s2 = "";
if (text2.get(0).equals("send")){
smsText (s);
}
else if (text2.get(0).equals("cancel")) return;
}
}
Мне нужно, чтобы активность распознавания голоса начиналась автоматически после того, как сообщение считывается, то есть после вызова метода talkOut (s). Но это означает, что я должен начать работу изнутри для первого речевого результата, который я не могу сделать – iMimi
@ user2303527 Это именно то, что вам нужно сделать - вызвать 'startActivityForResult()' для запуска нового распознавателя речи из 'onActivityResult '. Почему ты не можешь это сделать? – user113215
Потому что, когда я это сделал, он разбился. Я обновил сообщение с моей попыткой реализовать ваше предложение – iMimi