가계부 어플을 만들고 있는데요, 음성인식을 통해서 지출, 수입 내역을 입력하고 싶습니다.
입력 액티비티안에 expense cash, earning acsh, expense account, earning account 4개의 프래그먼트를 나눠놓아서 각 버튼을 누르면 그 프래그먼트 화면이 뜹니다. 입력 액티비티 안에는 구글API를 불러오는 음성인식 버튼이 있고, 그 결과값을 프레그먼트의 cost, explanation에 입력되게 하고 싶습니다.
문제는 제가 음성인식 버튼을 눌러 인식한 값이 프래그먼트의 cost, explanation 칸에 입력되지 않는 다는 것입니다. 여러 방법을 사용해 보았으나 입력이 되질 않아서 여기 질문을 올립니다.
코드는
다음이 inputactivity입니다. 이 액티비티 안에 프래그먼트레이아웃이 존재합니다.
public class InputActivity extends FragmentActivity implements OnClickListener {
private final int GOOGLE_STT = 1000;
final String TAG = "InputActivity";
int mCurrentFragmentIndex;
private ArrayList<String> mResult; //음성인식 결과 저장할 list;
private TextView mResultTextView01;
private TextView mResultTextView02;
public final static int FRAGMENT_ONE = 0;
public final static int FRAGMENT_TWO = 1;
public final static int FRAGMENT_THREE = 2;
public final static int FRAGMENT_FOUR = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input);
Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
Button bt_fourFragment = (Button) findViewById(R.id.bt_fourFragment);
Button bt_voice = (Button) findViewById(R.id.bt_Voice);
bt_oneFragment.setOnClickListener(this);
bt_twoFragment.setOnClickListener(this);
bt_threeFragment.setOnClickListener(this);
bt_fourFragment.setOnClickListener(this);
bt_voice.setOnClickListener(this);
mResultTextView01 = (EditText)findViewById(R.id.cost);
mResultTextView02 = (EditText)findViewById(R.id.explanation);
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
}
//ExpenseCashFragment f = (ExpenseCashFragment)getSupportFragmentManager().findFragmentById(R.id.display_fragment);
public void fragmentReplace(int reqNewFragmentIndex) {
Fragment newFragment = null;
newFragment = getFragment(reqNewFragmentIndex);
// replace fragment
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.display_fragment, newFragment);
// Commit the transaction
transaction.commit();
}
private Fragment getFragment(int idx) {
Fragment newFragment = null;
switch (idx) {
case FRAGMENT_ONE:
newFragment = new ExpenseCashFragment();
break;
case FRAGMENT_TWO:
newFragment = new ExpenseAccountFragment();
break;
case FRAGMENT_THREE:
newFragment = new EarningCashFragment();
break;
case FRAGMENT_FOUR:
newFragment = new EarningAccountFragment();
break;
default:
Log.d(TAG, "Unhandle case");
}
return newFragment;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_oneFragment:
mCurrentFragmentIndex = FRAGMENT_ONE;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_twoFragment:
mCurrentFragmentIndex = FRAGMENT_TWO;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_threeFragment:
mCurrentFragmentIndex = FRAGMENT_THREE;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_fourFragment:
mCurrentFragmentIndex = FRAGMENT_FOUR;
fragmentReplace(mCurrentFragmentIndex);
break;
case R.id.bt_Voice:
Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //intent 생성
i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName()); //음성인식을 호출한 패키지
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR"); //음성인식 언어 설정
i.putExtra(RecognizerIntent.EXTRA_PROMPT, "말을 하세요.");
startActivityForResult(i, GOOGLE_STT);
break;
default:
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.display_fragment);
fragment.onActivityResult(requestCode, resultCode, data);{
if( resultCode == RESULT_OK ){ //결과가 있으면
showResult(requestCode, data); //결과를 출력.
}
else{ //결과가 없으면 에러 메시지 출력
String msg = null;
//activity에서 넘어오는 오류 코드를 분류
switch(resultCode){
case SpeechRecognizer.ERROR_AUDIO:
msg = "오디오 입력 중 오류가 발생했습니다.";
break;
case SpeechRecognizer.ERROR_CLIENT:
msg = "단말에서 오류가 발생했습니다.";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
msg = "권한이 없습니다.";
break;
case SpeechRecognizer.ERROR_NETWORK:
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
msg = "네트워크 오류가 발생했습니다.";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
msg = "일치하는 항목이 없습니다.";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
msg = "음성인식 서비스가 과부하 되었습니다.";
break;
case SpeechRecognizer.ERROR_SERVER:
msg = "서버에서 오류가 발생했습니다.";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
msg = "입력이 없습니다.";
break;
}
if(msg != null) //오류 메시지가 null이 아니면 메시지 출력
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}
}
}
private void showResult(int requestCode, Intent data){
String key = "";
if(requestCode == GOOGLE_STT)
key = RecognizerIntent.EXTRA_RESULTS;
mResult = data.getStringArrayListExtra(key);
String[] result = new String[mResult.size()];
mResult.toArray(result);// list 배열로 변환
String i = result[0];
String[] count = i.split(" ");
mResultTextView01.setText(""+count[0]);
mResultTextView02.setText(""+count[1]);
}
}
프레그먼트에 onactivityresult 로 액티비티 값을 상속을 받으라고 하여서 이것을 넣어봤으나 되질 않습니다. 솔직히 말해서 매커니즘과 그 방법을 잘 모르겠습니다. 고수님들의 답변 부탁드립니다. ㅠㅠ