语音转文本结果 = 空错误

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);