2017-10-25 1 views
-3

음성 기능이있는 활동이 있습니다. 4 개의 단어를 말하게하고이 단어들이 배열에 추가됩니다. 나는 두 번째와 마지막 단어 만 원한다.Android Studio - 음성 검색 - 2 번과 4 번에 충돌 발생

두 번째 단어를 문자열로 변환하고 마지막 단어를 int로 변환합니다 (마지막 단어는 항상 1-5의 숫자입니다).

코드가 2 또는 4라고 말하지 않는 한 코드는 정상적으로 작동합니다. 곧 앱이 충돌하는 두 개의 숫자가 나옵니다.

어떻게 해결할 수 있습니까?

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

스택 트레이스에있는 내용은 무엇입니까? (아니 downvote) – Mudassir

+0

당신은 스택 추적을 의미합니까? 나는 여전히 자바를 배우고있다. 그래서 당신이 무슨 뜻인지 정말 모르겠어요. –

+0

모든 충돌 후 LogCat (eclipse 또는 Android Studio)에 표시된 충돌 로그입니다. – Mudassir

답변

1

2는 "to"또는 "too"라는 단어이기 때문에 일어날 수 있습니다. 이러한 경우를 잡기 전까지는 int로 변환 할 수 없습니다. 마찬가지로 4를 지적한 것처럼 "for"라는 단어로 변환되고 있습니다.이 단어는 특별히이 경우를 잡아 내지 않으면 int로 변환되지 않습니다.

나는 당신이 올바른 길을 가고 있다고 생각합니다. 음성으로 텍스트를 보내면 숫자 같은 소리가 들리지만 그럴 수는 없습니다.

하지만 코드를 충돌시키지 않으려면 가능한 입력을 준비해야합니다. 따라서 예외가 발생하면 예외를 catch 한 다음 올바른 작업을 수행해야합니다.

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

u는 똑똑한 사람입니다. –

+0

일반 예외를 포착하는 것은 항상 좋은 예외는 아닙니다. – AnCoder

+0

parseInt (NumberFormatException) –

관련 문제