반응형

2016. 11. 14 수정

김병희님이 댓글로 알려주셔서 onPause에 있는 코드를 onDestroy로 옮겼습니다.

다른 앱을 실행시키다 돌아왔을 때 음성 출력이 안되는 문제가 해결됩니다.




2015.12.03

입력창에 원하는 한글 문자열을 입력하고 버튼을 클릭하면 읽어주는 간단한 예제입니다. 생각보다 짧은 코드로 기능이 구현가능하네요..





activity_main.xml 파일입니다. 텍스트를 입력할 EditText 하나와 클릭하면 TTS를 실행시켜줄 버튼으로 구성되어 있습니다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:transitionGroup="true">
 
 
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:id="@+id/editText"/>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text to Speech"
        android:id="@+id/button"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp" />
 
</RelativeLayout>
cs




MainActivity.java 파일입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.tistory.webnautes.texttospeech;
 
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
 
import android.speech.tts.TextToSpeech;
import android.view.View;
 
import android.widget.Button;
import android.widget.EditText;
 
import java.util.HashMap;
import java.util.Locale;
import android.widget.Toast;
 
 
public class MainActivity extends Activity {
    TextToSpeech tts;
    EditText inputtext;
    Button button;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        inputtext=(EditText)findViewById(R.id.editText);
        button=(Button)findViewById(R.id.button);
 
 
        tts=new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status != TextToSpeech.ERROR) {
                    tts.setLanguage(Locale.KOREAN);
                }
            }
        });
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String text = inputtext.getText().toString();
                Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
 
 
                //http://stackoverflow.com/a/29777304
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ttsGreater21(text);
                } else {
                    ttsUnder20(text);
                }
 
            }
        });
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
 
        if(tts !=null){
            tts.stop();
            tts.shutdown();
        }
    }
 
 
    @SuppressWarnings("deprecation")
    private void ttsUnder20(String text) {
        HashMap<StringString> map = new HashMap<>();
        map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
    }
 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void ttsGreater21(String text) {
        String utteranceId=this.hashCode() + "";
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
    }
}
cs


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. Favicon of http://blog.daum.net/andro_java/ BlogIcon 김병희 2016.11.14 15:32

    onPause에서 stop/shutdown => 다른 앱으로 갔다가 돌아오면 음성출력 한됨
    onDestroy에서 stop/shutdown 처리하는 것이 ...

  2. 안드초보 2017.07.17 17:47

    혹시 적절한 타켓 API도 있나요?
    아무 API나 써도 되는건가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.07.17 17:53 신고

      코드 작성시에는 간단히 구현하는 방법으로 롤리팝을 기준으로 이하일때와 이상일때가 나누어져 구현되었는데 지금은 어떨지 확인해봐야 할듯합니다..

+ Recent posts