마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 패키지 내부 클래스 사용하기

0 추천

음성인식으로 메모, 계산기를 사용할 수 있는 앱을 만들고 있습니다.

음성인식을 하는 코드가 메모와 계산기에서 중복으로 사용되기 때문에 하나로 만들고 싶은데 안드로이드 초보다 보니 조금 헤매고 있습니다.

파일은 크게 Speech.java    Memo.java     Cal.java가 있고

Speech.java는 맨 아래코드와 같습니다.

원하는 것은 Memo.java, Cal.java에서 Speech를 import해와서 SpeechStart() 실행하면 결과값 return받고 싶습니다.

 

제가 한것으로 

import com.example.lee.firsttest.Speech;
Speech ch = new Speech();
ch.SpeechStart();

로 하니 에러가 뜹니다.

public void onResults(Bundle results)

를 public String onResults로 바꾸고 return builder.toString() 하려니 카카오 API쓰는 거라 안되네요

해결방법 조언 부탁드리겠습니다.

 

        package com.example.test;

        import android.app.Activity;
        import com.kakao.sdk.newtoneapi.SpeechRecognizeListener;

public class Speech extends Activity implements SpeechRecognizeListener {
    private SpeechRecognizerClient client;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SpeechRecognizerManager.getInstance().initializeLibrary(this);
        SpeechStart();

    }

    public void SpeechStart(){
        //음성 인식 실행
        String serviceType = SpeechRecognizerClient.SERVICE_TYPE_WORD;
        if(PermissionUtils.checkAudioRecordPermission(this)) {
            SpeechRecognizerClient.Builder builder = new SpeechRecognizerClient.Builder().
                    setServiceType(serviceType);
            if (serviceType.equals(SpeechRecognizerClient.SERVICE_TYPE_WORD)) {
                String Dict = "메모,계산기";
                Dict = Dict.replace(',','\n');
                builder.setUserDictionary(Dict);
            }

            client = builder.build();
            client.setSpeechRecognizeListener(this);
            client.startRecording(true);
            //실행
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // API를 더이상 사용하지 않을 때 finalizeLibrary()를 호출한다.
        SpeechRecognizerManager.getInstance().finalizeLibrary();
    }

    @Override
    public void onResults(Bundle results) {
        final StringBuilder builder = new StringBuilder();
        Log.i("MainActivity", "onResults");

        ArrayList<String> texts = results.getStringArrayList(SpeechRecognizerClient.KEY_RECOGNITION_RESULTS);
        ArrayList<Integer> confs = results.getIntegerArrayList(SpeechRecognizerClient.KEY_CONFIDENCE_VALUES);

        builder.append(texts.get(0));

        final Activity activity = this;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (activity.isFinishing()) return;
                Log.i("MainActivity", "builder.toString() : " + builder.toString());
            } //결과가 builder.toString()
        });
        client = null;
    }

    @Override
    public void onFinished() {
        Log.i("MainActivity", "onFinished");
    }
}
눈온다다다 (730 포인트) 님이 2017년 8월 30일 질문

1개의 답변

0 추천

class Speech extends Activity <--액티비티네요

Speech ch = new Speech();

상단에서 생성자 불러오고 있는데 액티비는 생성자를 직접 호출하면 안됩니다.

액티비티 코드 빼시고요

 

final Activity activity = this;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (activity.isFinishing()) return;
                Log.i("MainActivity", "builder.toString() : " + builder.toString());
            } //결과가 builder.toString()
        });

<--아마 메인액티비티로 전달하는 코드이리라 예상되는데(무엇을 위한 코드인지 설명부탁드립니다) 

 

익명사용자 님이 2017년 8월 31일 답변
답변감사합니다.
        runOnUiThread(new Runnable()
해당 코드는 카카오에서 음성인식쓰려면 예제 응용한거라 그냥 둔것입니다.
필요없다면 지우도록 하겠습니다.
public String onResults(Bundle results) {
                   .................
        builder.append(texts.get(0));
        return builder.soString();

으로 받고 싶은데

public String onResults로 수정하니까

onResults(Bundle) in 'com.example.test.Speech' clashes with 'onResults(Bundle)' in 'com.kakao.sdk.newtoneapi.SpeechRecongnizeListener'; attempting to use incompatible return type
가 뜨는데 결과값을 메모나 계산기 액티비티에서 받을 수 없을까요?
이미 리턴타입이 정해져있는 인터페이스를 강제로 바꿀수는 없고요 콜백 인터페이스 추가하셔서 넘기셔야 합니다.
ex)
public interface MyCustomObjectListener {
      
      public void onDataLoaded(String data);
  }
Speech ch = new Speech(new MyCustomObjectListener(){
    @Override
    public void onDataLoaded(String data){

    }
});
//Speech.class
@Override
    public void onResults(Bundle results) {
        final StringBuilder builder = new StringBuilder();
        Log.i("MainActivity", "onResults");

        ArrayList<String> texts = results.getStringArrayList(SpeechRecognizerClient.KEY_RECOGNITION_RESULTS);
        ArrayList<Integer> confs = results.getIntegerArrayList(SpeechRecognizerClient.KEY_CONFIDENCE_VALUES);

        builder.append(texts.get(0));
MyCustomObjectListener.onDataLoaded( builder.soString());
}

http://yujuwon.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A6%AC%EC%8A%A4%EB%84%88-%EB%A7%8C%EB%93%A4%EA%B8%B0
...