语音转文本结果 = 空错误
Speech to text result = null error
简要说明:该应用程序将根据单词库文件中的单词向用户显示随机图像,用户必须识别图像的名称(单个单词)。用户可以通过单击传递按钮 "pass" 或识别图像,然后将弹出 "next" 按钮将他们引导至下一张图像。
在最后一张图片中,下一个按钮将替换为 "Continue" 按钮,该按钮将引导用户进入游戏结束屏幕
问题:
每次,我到达最后一张图片并尝试回答它,或者当 "continue" 按钮出现时,我单击它也会导致游戏崩溃。 "unfortunately, pic has stopped"
错误消息指向行:
if (wordBANK.contains(result.get(0).toLowerCase()) && UnSpokenList.get(randomNum).contains(result.get(0).toLowerCase())) {
我没有发现这条线有任何问题,因为它在之前的图像上运行良好,直到最后一张图像。
Main.Java
public class Main extends Activity implements AdapterView.OnItemSelectedListener {
private static final int VR_Request = 100;
Button restart;
Button mainMenu;
Button pass;
Button next;
Button last2image;
Button gameOver;
TextView speechInput;
TextView matchOrNot;
String[] wordBank;
ArrayList<String> wordBANK;
Spinner wordList;
Spinner SpokenWords;
ArrayList<String> UnSpokenList;
ArrayList<String> SpokenList;
ArrayAdapter<String> wordList_adapter;
ArrayAdapter<String> SpokenList_adapter;
ImageButton speechBtn;
ImageView image;
Resources res;
int resID;
Random random;
int randomNum;
int previous;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pictionary);
speechInput = (TextView) findViewById(R.id.english_word1);
matchOrNot = (TextView) findViewById(R.id.matchOrNot1);
wordBank = getResources().getStringArray(R.array.Words);
speechBtn = (ImageButton) findViewById(R.id.mic_pic_button1);
wordBANK = new ArrayList<String>(Arrays.asList(wordBank));
image = (ImageView) findViewById(R.id.imageView1);
res = getResources();
restart = (Button) findViewById(R.id.restartButton1);
mainMenu = (Button) findViewById(R.id.mainMenubutton1);
pass = (Button) findViewById(R.id.passButton);
next = (Button) findViewById(R.id.nextButton);
last2image = (Button) findViewById(R.id.last2image);
gameOver = (Button) findViewById(R.id.gameOverTime);
wordList = (Spinner) findViewById(R.id.wordsList1);
SpokenWords = (Spinner) findViewById(R.id.spokenWords1);
UnSpokenList = new ArrayList<String>(Arrays.asList(wordBank));
SpokenList = new ArrayList<String>(wordBank.length+1);
UnSpokenList.add(0, "Word Bank:");
SpokenList.add(0,"Spoken Words:");
wordList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, UnSpokenList);
wordList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
wordList.setAdapter(wordList_adapter);
SpokenList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SpokenList);
SpokenList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
SpokenWords.setAdapter(SpokenList_adapter);
random = new Random();
randomNum = (random.nextInt(UnSpokenList.size()-1)+1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
speechBtn.setClickable(true);
last2image.setVisibility(View.INVISIBLE);
last2image.setClickable(false);
gameOver.setVisibility(View.INVISIBLE);
gameOver.setClickable(false);
restart.setVisibility(View.INVISIBLE);
mainMenu.setVisibility(View.INVISIBLE);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void onMicButton(View view) {
}
public void onNext(View view){
if(view.getId() == R.id.nextButton){
speechInput.setText("");
matchOrNot.setText("");
randomNum = (random.nextInt(UnSpokenList.size()-1) + 1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
speechBtn.setClickable(true);
}
}
/**
* This function occurs when the user plays all the way to last 2 image left in game
*/
public void onlastPair(View view){
if(view.getId() == R.id.last2image){
speechInput.setText("");
matchOrNot.setText("");
resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()-1), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
speechBtn.setClickable(true);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
last2image.setClickable(true);
last2image.setVisibility(View.INVISIBLE);
if(UnSpokenList.size() == 2){
pass.setClickable(false);
}
}
}
public void onGameOver(View view){
if(view.getId() == R.id.gameOverTime) {
speechInput.setTextColor(Color.RED);
speechInput.setText("GAME OVER!");
matchOrNot.setText("");
image.setImageBitmap(null);
restart.setVisibility(View.VISIBLE);
mainMenu.setVisibility(View.VISIBLE);
pass.setVisibility(View.INVISIBLE);
next.setVisibility(View.INVISIBLE);
last2image.setVisibility(View.INVISIBLE);
gameOver.setVisibility(View.INVISIBLE);
}
}
public void onPass(View view){
}
public void onResetPic(View view){
}
public void reset(){
}
public void MainMenu(View view){
}
public void promptSpeechInput() {
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode == VR_Request && resultCode == RESULT_OK) {
ArrayList<String> result = intent.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (wordBANK.contains(result.get(0).toLowerCase()) && UnSpokenList.get(randomNum).contains(result.get(0).toLowerCase())) {
speechInput.setText(result.get(0).toUpperCase());
matchOrNot.setTextColor(Color.GREEN);
matchOrNot.setText("CORRECT!");
UnSpokenList.remove(result.get(0).toLowerCase());
SpokenList.add(result.get(0).toLowerCase());
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
speechBtn.setClickable(false);
if (UnSpokenList.size() > 3) {
next.setClickable(true);
next.setVisibility(View.VISIBLE);
} else {
last2image.setVisibility(View.VISIBLE);
last2image.setClickable(true);
}
if (UnSpokenList.size() == 1) {
last2image.setVisibility(View.INVISIBLE);
last2image.setClickable(false);
next.setVisibility(View.INVISIBLE);
next.setClickable(false);
gameOver.setVisibility(View.VISIBLE);
gameOver.setClickable(true);
}
}else{
speechInput.setText(result.get(0).toLowerCase());
matchOrNot.setTextColor(Color.RED);
matchOrNot.setText("TRY AGAIN!");
pass.setVisibility(View.VISIBLE);
pass.setClickable(true);
}
}
super.onActivityResult(requestCode, resultCode, intent);
}
}
错误信息:
08-17 23:46:18.397 27287-27287/com.example.speechtotext D/AndroidRuntime: Shutting down VM
08-17 23:46:18.397 27287-27287/com.example.speechtotext E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.speechtotext, PID: 27287
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { (has extras) }} to activity {com.example.speechtotext.Main}: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.example.speechtotext.Main.onActivityResult(Main.java:343)
at android.app.Activity.dispatchActivityResult(Activity.java:6428)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 23:46:21.356 27287-27287/com.example.speechtotext I/Process: Sending signal. PID: 27287 SIG: 9
有什么想法吗?提前谢谢您!
看起来您正在从 onActivityResult
中删除 UnSpokenList
中的一个元素,但在获得最终图像之前没有更改 randomNum
的值。
在应用程序崩溃的行上方添加以下日志记录,您将看到错误:
Log.i("TAG", "The array size is : " + UnSpokenList.size());
Log.i("TAG", "Attempting to get random position: " + randomNum);
简要说明:该应用程序将根据单词库文件中的单词向用户显示随机图像,用户必须识别图像的名称(单个单词)。用户可以通过单击传递按钮 "pass" 或识别图像,然后将弹出 "next" 按钮将他们引导至下一张图像。 在最后一张图片中,下一个按钮将替换为 "Continue" 按钮,该按钮将引导用户进入游戏结束屏幕
问题: 每次,我到达最后一张图片并尝试回答它,或者当 "continue" 按钮出现时,我单击它也会导致游戏崩溃。 "unfortunately, pic has stopped"
错误消息指向行:
if (wordBANK.contains(result.get(0).toLowerCase()) && UnSpokenList.get(randomNum).contains(result.get(0).toLowerCase())) {
我没有发现这条线有任何问题,因为它在之前的图像上运行良好,直到最后一张图像。
Main.Java
public class Main extends Activity implements AdapterView.OnItemSelectedListener {
private static final int VR_Request = 100;
Button restart;
Button mainMenu;
Button pass;
Button next;
Button last2image;
Button gameOver;
TextView speechInput;
TextView matchOrNot;
String[] wordBank;
ArrayList<String> wordBANK;
Spinner wordList;
Spinner SpokenWords;
ArrayList<String> UnSpokenList;
ArrayList<String> SpokenList;
ArrayAdapter<String> wordList_adapter;
ArrayAdapter<String> SpokenList_adapter;
ImageButton speechBtn;
ImageView image;
Resources res;
int resID;
Random random;
int randomNum;
int previous;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pictionary);
speechInput = (TextView) findViewById(R.id.english_word1);
matchOrNot = (TextView) findViewById(R.id.matchOrNot1);
wordBank = getResources().getStringArray(R.array.Words);
speechBtn = (ImageButton) findViewById(R.id.mic_pic_button1);
wordBANK = new ArrayList<String>(Arrays.asList(wordBank));
image = (ImageView) findViewById(R.id.imageView1);
res = getResources();
restart = (Button) findViewById(R.id.restartButton1);
mainMenu = (Button) findViewById(R.id.mainMenubutton1);
pass = (Button) findViewById(R.id.passButton);
next = (Button) findViewById(R.id.nextButton);
last2image = (Button) findViewById(R.id.last2image);
gameOver = (Button) findViewById(R.id.gameOverTime);
wordList = (Spinner) findViewById(R.id.wordsList1);
SpokenWords = (Spinner) findViewById(R.id.spokenWords1);
UnSpokenList = new ArrayList<String>(Arrays.asList(wordBank));
SpokenList = new ArrayList<String>(wordBank.length+1);
UnSpokenList.add(0, "Word Bank:");
SpokenList.add(0,"Spoken Words:");
wordList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, UnSpokenList);
wordList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
wordList.setAdapter(wordList_adapter);
SpokenList_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SpokenList);
SpokenList_adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
SpokenWords.setAdapter(SpokenList_adapter);
random = new Random();
randomNum = (random.nextInt(UnSpokenList.size()-1)+1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
speechBtn.setClickable(true);
last2image.setVisibility(View.INVISIBLE);
last2image.setClickable(false);
gameOver.setVisibility(View.INVISIBLE);
gameOver.setClickable(false);
restart.setVisibility(View.INVISIBLE);
mainMenu.setVisibility(View.INVISIBLE);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void onMicButton(View view) {
}
public void onNext(View view){
if(view.getId() == R.id.nextButton){
speechInput.setText("");
matchOrNot.setText("");
randomNum = (random.nextInt(UnSpokenList.size()-1) + 1);
resID = res.getIdentifier(UnSpokenList.get(randomNum), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
speechBtn.setClickable(true);
}
}
/**
* This function occurs when the user plays all the way to last 2 image left in game
*/
public void onlastPair(View view){
if(view.getId() == R.id.last2image){
speechInput.setText("");
matchOrNot.setText("");
resID = res.getIdentifier(UnSpokenList.get(UnSpokenList.size()-1), "drawable", getApplication().getPackageName());
image.setImageResource(resID);
speechBtn.setClickable(true);
next.setClickable(false);
next.setVisibility(View.INVISIBLE);
pass.setClickable(true);
pass.setVisibility(View.VISIBLE);
last2image.setClickable(true);
last2image.setVisibility(View.INVISIBLE);
if(UnSpokenList.size() == 2){
pass.setClickable(false);
}
}
}
public void onGameOver(View view){
if(view.getId() == R.id.gameOverTime) {
speechInput.setTextColor(Color.RED);
speechInput.setText("GAME OVER!");
matchOrNot.setText("");
image.setImageBitmap(null);
restart.setVisibility(View.VISIBLE);
mainMenu.setVisibility(View.VISIBLE);
pass.setVisibility(View.INVISIBLE);
next.setVisibility(View.INVISIBLE);
last2image.setVisibility(View.INVISIBLE);
gameOver.setVisibility(View.INVISIBLE);
}
}
public void onPass(View view){
}
public void onResetPic(View view){
}
public void reset(){
}
public void MainMenu(View view){
}
public void promptSpeechInput() {
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode == VR_Request && resultCode == RESULT_OK) {
ArrayList<String> result = intent.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (wordBANK.contains(result.get(0).toLowerCase()) && UnSpokenList.get(randomNum).contains(result.get(0).toLowerCase())) {
speechInput.setText(result.get(0).toUpperCase());
matchOrNot.setTextColor(Color.GREEN);
matchOrNot.setText("CORRECT!");
UnSpokenList.remove(result.get(0).toLowerCase());
SpokenList.add(result.get(0).toLowerCase());
pass.setClickable(false);
pass.setVisibility(View.INVISIBLE);
speechBtn.setClickable(false);
if (UnSpokenList.size() > 3) {
next.setClickable(true);
next.setVisibility(View.VISIBLE);
} else {
last2image.setVisibility(View.VISIBLE);
last2image.setClickable(true);
}
if (UnSpokenList.size() == 1) {
last2image.setVisibility(View.INVISIBLE);
last2image.setClickable(false);
next.setVisibility(View.INVISIBLE);
next.setClickable(false);
gameOver.setVisibility(View.VISIBLE);
gameOver.setClickable(true);
}
}else{
speechInput.setText(result.get(0).toLowerCase());
matchOrNot.setTextColor(Color.RED);
matchOrNot.setText("TRY AGAIN!");
pass.setVisibility(View.VISIBLE);
pass.setClickable(true);
}
}
super.onActivityResult(requestCode, resultCode, intent);
}
}
错误信息:
08-17 23:46:18.397 27287-27287/com.example.speechtotext D/AndroidRuntime: Shutting down VM
08-17 23:46:18.397 27287-27287/com.example.speechtotext E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.speechtotext, PID: 27287
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { (has extras) }} to activity {com.example.speechtotext.Main}: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at com.example.speechtotext.Main.onActivityResult(Main.java:343)
at android.app.Activity.dispatchActivityResult(Activity.java:6428)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 23:46:21.356 27287-27287/com.example.speechtotext I/Process: Sending signal. PID: 27287 SIG: 9
有什么想法吗?提前谢谢您!
看起来您正在从 onActivityResult
中删除 UnSpokenList
中的一个元素,但在获得最终图像之前没有更改 randomNum
的值。
在应用程序崩溃的行上方添加以下日志记录,您将看到错误:
Log.i("TAG", "The array size is : " + UnSpokenList.size());
Log.i("TAG", "Attempting to get random position: " + randomNum);