Java 安卓工作室-语音搜索-在说2号和4号时崩溃
我有一个具有语音功能的活动。这让你说出4个单词,这些单词被添加到一个数组中。我只想要第二个和最后一个字 我将第二个字转换成字符串,最后一个字转换成整数(最后一个字总是1-5之间的数字) 只要我不说2或4,代码就可以正常工作。我一说出这两个数字,应用程序就崩溃了 我怎样才能解决这个问题 我试着考虑插入一个if语句。例如,如果字符串包含单词for,则它=4。(粗略代码) 我已经在下面发布了代码和堆栈跟踪Java 安卓工作室-语音搜索-在说2号和4号时崩溃,java,android,text-to-speech,voice,Java,Android,Text To Speech,Voice,我有一个具有语音功能的活动。这让你说出4个单词,这些单词被添加到一个数组中。我只想要第二个和最后一个字 我将第二个字转换成字符串,最后一个字转换成整数(最后一个字总是1-5之间的数字) 只要我不说2或4,代码就可以正常工作。我一说出这两个数字,应用程序就崩溃了 我怎样才能解决这个问题 我试着考虑插入一个if语句。例如,如果字符串包含单词for,则它=4。(粗略代码) 我已经在下面发布了代码和堆栈跟踪 public class Report extends AppCompatActivity {
public class Report extends AppCompatActivity {
private static final int REQ_CODE_SPEECH_INPUT = 100;
private TextView mVoiceInputTv;
private ImageButton mSpeakBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.report);
mVoiceInputTv = (TextView) findViewById(R.id.voiceInput);
mSpeakBtn = (ImageButton) findViewById(R.id.btnSpeak);
mSpeakBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startVoiceInput();
}
});
final String carreg = mVoiceInputTv.getText().toString();
}
private void startVoiceInput() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "e.g- Report fpg563 rating 3");
try {
startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
} catch (ActivityNotFoundException a) {
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQ_CODE_SPEECH_INPUT: {
if (resultCode == RESULT_OK && null != data) {
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
mVoiceInputTv.setText(result.get(0));
}
break;
}
}
if(mVoiceInputTv.getText().toString().contains("report")) {
input();
}
}
public void input() {
String test = mVoiceInputTv.getText().toString();
String[] ms = test.split(" ");
List<String> selectedWords = new ArrayList<>();
for (int i = 0; i < ms.length; i++) {
selectedWords.add(ms[i]);
final String carreg = ms[1];
final String newrating = ms[3];
final int rating = Integer.parseInt(newrating);
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
if (success) {
Intent intent = new Intent(Report.this, Report.class);
Report.this.startActivity(intent);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(Report.this);
builder.setMessage("Reporting Failed")
.setNegativeButton("Retry", null)
.create()
.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Report_request registerRequest = new Report_request(carreg, rating, responseListener);
RequestQueue queue = Volley.newRequestQueue(Report.this);
queue.add(registerRequest);
}
}
}
这是怎么回事?我在问一个诚实的问题。当然,语法可能不好。但是我还在学英语。你想让我在发帖之前先去上英语课吗 这一定发生了,因为2也是“to”或“too”这个词,除非您捕捉到这些情况,否则它不能转换为int。类似地,正如您所指出的,4可能被转换为单词“for”,除非您特别注意到这种情况,否则它也不会转换为int 我认为你的思路是对的,在这种情况下,语音文字转换会给你一个听起来像数字但不是一的单词 但是,如果您希望代码不会崩溃,则需要为任何可能的输入做好准备。因此,如果抛出异常,您应该捕获它,然后做正确的事情
try {
final int rating = Integer.parseInt(newrating);
} catch ( NumberFormatException e ) {
//uhoh couldn't get the number
//prompt the user to try again or
//do something else that makes sense
}
堆栈跟踪中有什么,请共享。(没有否决票)堆栈跟踪是什么意思?我还在学java。所以我不太清楚你的意思。在问下一个问题之前,你最好先读一下这篇文章;请了解它(异常处理),如果不处理异常,就无法编写任何有用的代码。在您的上述问题中,请捕获
java.lang.NumberFormatException
,并向用户显示一些友好的消息,并要求他们更正输入。由于您在问题中付出了努力,并使其正确,我对其进行了编辑和升级。您是个聪明人:)捕获泛型异常并不总是好的,特别是如果您知道引发的异常。更新了parseInt(NumberFormatException)引发的特定异常的答案yea。我还是有同样的问题。是否可以执行if语句?例如将数组[3](最后一个字)添加到字符串中。如果字符串包含单词for,则创建一个数字为4的新int值。类似的事情?哦,我用if语句修复了它:)
try {
final int rating = Integer.parseInt(newrating);
} catch ( NumberFormatException e ) {
//uhoh couldn't get the number
//prompt the user to try again or
//do something else that makes sense
}