2017-10-25 3 views
-3

私は音声機能を持っています。あなたは4つの単語を言うことができ、これらの単語は配列に追加されます。私は第二と最後の言葉だけが欲しい。Androidスタジオ - 音声検索 - 番号2と4でクラッシュする

私は2番目の単語を文字列に変換し、最後の単語をintに変換しています(最後の単語は常に1-5の数字です)。

私は2または4と言っていない限り、コードは正常に動作しています。すぐに私はこれらの2つの数字がアプリクラッシュすると言う。

どうすればこの問題を解決できますか?

if文を挿入しようとしました。たとえば、文字列に単語が含まれている場合は4、それ以降は4となります(概略コード)。

下記のコードとスタックトレースを掲載しました。

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

} 

スタックトレース:

10-25 17:45:41.449 32501-32501/com.example.naveen.loginregister E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.naveen.loginregister, PID: 32501 
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 }(has extras) }} to activity {com.example.naveen.loginregister/com.example.naveen.loginregister.Report}: java.lang.NumberFormatException: For input string: "for" 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:4472) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4515) 
     at android.app.ActivityThread.-wrap22(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6682) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 
    Caused by: java.lang.NumberFormatException: For input string: "for" 
     at java.lang.Integer.parseInt(Integer.java:521) 
     at java.lang.Integer.parseInt(Integer.java:556) 
     at com.example.naveen.loginregister.Report.input(Report.java:103) 
     at com.example.naveen.loginregister.Report.onActivityResult(Report.java:85) 
     at android.app.Activity.dispatchActivityResult(Activity.java:7256) 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:4468) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4515)  
     at android.app.ActivityThread.-wrap22(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:154)  
     at android.app.ActivityThread.main(ActivityThread.java:6682)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)  

いただきました!このdownvotesとアップ?私は正直な質問をしています。文法は悪いかもしれません。私はまだ英語を学んでいます。私は質問を投稿する前に私に英語のクラスに行きたいですか?

+0

スタックトレースとは何ですか、共有してください。 (no downvote) – Mudassir

+0

スタックトレースはどういう意味ですか?私はまだJavaを学んでいます。あなたは何を意味するのかわかりません。 –

+0

クラッシュが発生するたびにLogCat(eclipseまたはAndroid Studio)に表示されるクラッシュログ。 – Mudassir

答えて

1

2は「to」または「too」という単語でもあり、これらのケースをキャッチしない限りintに変換できないため、これが起こっているはずです。同様に、あなたが指摘しているように、4は恐らくあなたがそのケースを特にキャッチしない限り、おそらくintに変換されない単語「for」に変換されているでしょう。

あなたは正しい方向に向かっていると思いますが、音声をテキストに変換すると、数字のように聞こえるが、1つではない単語が表示されます。

しかし、コードがクラッシュしないようにするには、可能な入力を準備する必要があります。したがって、スローされた場合は例外をキャッチしてから、適切なことを行う必要があります。

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 
} 
+0

あなたはスマートな男です:) –

+0

ジェネリック例外をキャッチすることは、例外がスローされたことを知っている場合は、特に良いとは限りません。 – AnCoder

+0

parseInt(NumberFormatException) –

関連する問題