在Android1.6之后添加了TextToSpeech,也叫TTS,把相应的文字转化成语音播报,增强了用户体验。可以根据语言播报

界面上的控件如下:

可以选择的语言

但有的语言不支持,比如中文就不支持

代码也比较简单,能简单介绍TTS的用法

MainActivity.java

package com.example.tts;

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Locale;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.speech.tts.TextToSpeech;
  7. import android.speech.tts.TextToSpeech.OnInitListener;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.AdapterView;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.Spinner;
  15. import android.widget.Toast;
  16. /**
  17. * 根据选择的语言播报TTS
  18. *
  19. * @author Administrator
  20. *
  21. */
  22. public class MainActivity extends Activity {
  23. private TextToSpeech mSpeech = null;
  24. private Spinner langSpinner = null;
  25. private EditText edit = null;
  26. private Button btn = null;
  27. private String[] langs;
  28. private String curLang;
  29. private List<String> langList = new ArrayList<String>();
  30. private ArrayAdapter<String> langAdapter;
  31. @Override
  32. protected void onCreate(Bundle savedInstanceState) {
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.main);
  35. langs = getResources().getStringArray(R.array.languages); // 得到语言数组
  36. langSpinner = (Spinner) findViewById(R.id.spinner);
  37. edit = (EditText) findViewById(R.id.edit);
  38. btn = (Button) findViewById(R.id.btn);
  39. btn.setOnClickListener(new BtnListener());
  40. for (int i = 0; i < langs.length; i++) {
  41. langList.add(langs[i]);
  42. }
  43. // 设置下拉框的适配器和样式
  44. langAdapter = new ArrayAdapter<String>(MainActivity.this,
  45. android.R.layout.simple_spinner_item, langList);
  46. langAdapter
  47. .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  48. langSpinner.setAdapter(langAdapter);
  49. // 下拉框监听器
  50. langSpinner
  51. .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  52. @Override
  53. public void onItemSelected(AdapterView<?> adapter,
  54. View view, int position, long id) {
  55. // TODO Auto-generated method stub
  56. curLang = (String) langSpinner.getAdapter().getItem(
  57. (int) id);
  58. if(mSpeech != null)
  59. {
  60. mSpeech.stop();
  61. mSpeech.shutdown();
  62. mSpeech = null;
  63. }
  64. // 创建TTS对象
  65. mSpeech = new TextToSpeech(MainActivity.this, new TTSListener());
  66. Toast.makeText(MainActivity.this, "select = " + curLang, Toast.LENGTH_SHORT).show();
  67. }
  68. @Override
  69. public void onNothingSelected(AdapterView<?> arg0) {
  70. // TODO Auto-generated method stub
  71. }
  72. });
  73. }
  74. private int SetLanguage(String lang) {
  75. int result = 0;
  76. if (lang.equals("CANADA")) {
  77. result = mSpeech.setLanguage(Locale.CANADA);
  78. } else if (lang.equals("CANADA_FRENCH")) {
  79. result = mSpeech.setLanguage(Locale.CANADA_FRENCH);
  80. } else if (lang.equals("CHINA")) {
  81. result = mSpeech.setLanguage(Locale.CHINA);
  82. } else if (lang.equals("CHINESE")) {
  83. result = mSpeech.setLanguage(Locale.CHINESE);
  84. } else if (lang.equals("ENGLISH")) {
  85. result = mSpeech.setLanguage(Locale.ENGLISH);
  86. } else if (lang.equals("FRANCE")) {
  87. result = mSpeech.setLanguage(Locale.FRANCE);
  88. } else if (lang.equals("FRENCH")) {
  89. result = mSpeech.setLanguage(Locale.FRENCH);
  90. } else if (lang.equals("GERMAN")) {
  91. result = mSpeech.setLanguage(Locale.GERMAN);
  92. } else if (lang.equals("GERMANY")) {
  93. result = mSpeech.setLanguage(Locale.GERMANY);
  94. } else if (lang.equals("ITALIAN")) {
  95. result = mSpeech.setLanguage(Locale.ITALIAN);
  96. } else if (lang.equals("ITALY")) {
  97. result = mSpeech.setLanguage(Locale.ITALY);
  98. } else if (lang.equals("JAPAN")) {
  99. result = mSpeech.setLanguage(Locale.JAPAN);
  100. } else if (lang.equals("JAPANESE")) {
  101. result = mSpeech.setLanguage(Locale.JAPANESE);
  102. } else if (lang.equals("KOREA")) {
  103. result = mSpeech.setLanguage(Locale.KOREA);
  104. } else if (lang.equals("KOREAN")) {
  105. result = mSpeech.setLanguage(Locale.KOREAN);
  106. } else if (lang.equals("PRC")) {
  107. result = mSpeech.setLanguage(Locale.PRC);
  108. } else if (lang.equals("ROOT")) {
  109. result = mSpeech.setLanguage(Locale.ROOT);
  110. } else if (lang.equals("SIMPLIFIED_CHINESE")) {
  111. result = mSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
  112. } else if (lang.equals("TAIWAN")) {
  113. result = mSpeech.setLanguage(Locale.TAIWAN);
  114. } else if (lang.equals("TRADITIONAL_CHINESE")) {
  115. result = mSpeech.setLanguage(Locale.TRADITIONAL_CHINESE);
  116. } else if (lang.equals("UK")) {
  117. result = mSpeech.setLanguage(Locale.UK);
  118. } else if (lang.equals("US")) {
  119. result = mSpeech.setLanguage(Locale.US);
  120. }
  121. return result;
  122. }
  123. private class TTSListener implements OnInitListener {
  124. @Override
  125. public void onInit(int status) {
  126. // TODO Auto-generated method stub
  127. if (status == TextToSpeech.SUCCESS) {
  128. //int result = mSpeech.setLanguage(Locale.ENGLISH);
  129. int result = SetLanguage(curLang);
  130. //如果打印为-2,说明不支持这种语言
  131. Toast.makeText(MainActivity.this, "-------------result = " + result, Toast.LENGTH_LONG).show();
  132. if (result == TextToSpeech.LANG_MISSING_DATA
  133. || result == TextToSpeech.LANG_NOT_SUPPORTED) {
  134. System.out.println("-------------not use");
  135. } else {
  136. mSpeech.speak("i love you", TextToSpeech.QUEUE_FLUSH, null);
  137. }
  138. }
  139. }
  140. }
  141. private class BtnListener implements OnClickListener {
  142. @Override
  143. public void onClick(View v) {
  144. // TODO Auto-generated method stub
  145. mSpeech.speak(edit.getText().toString(), TextToSpeech.QUEUE_FLUSH,
  146. null);
  147. }
  148. }
  149. @Override
  150. protected void onDestroy() {
  151. // TODO Auto-generated method stub
  152. if (mSpeech != null) {
  153. mSpeech.stop();
  154. mSpeech.shutdown();
  155. mSpeech = null;
  156. }
  157. super.onDestroy();
  158. }
  159. }

布局文件

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity" >
  6. <TextView
  7. android:id="@+id/text"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/hello_world" />
  11. <TextView
  12. android:id="@+id/label"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_below="@id/text"
  16. android:text="@string/select_language" />
  17. <Spinner
  18. android:id="@+id/spinner"
  19. android:layout_width="150dip"
  20. android:layout_height="wrap_content"
  21. android:layout_below="@id/label"
  22. android:drawSelectorOnTop="false" />
  23. <TextView
  24. android:id="@+id/label2"
  25. android:layout_width="match_parent"
  26. android:layout_height="wrap_content"
  27. android:layout_below="@id/spinner"
  28. android:text="@string/text" />
  29. <EditText
  30. android:id="@+id/edit"
  31. android:layout_width="match_parent"
  32. android:layout_height="wrap_content"
  33. android:layout_below="@id/label2"
  34. android:text="@string/example"
  35. android:inputType="text"
  36. />
  37. <Button
  38. android:id="@+id/btn"
  39. android:layout_width="match_parent"
  40. android:layout_height="wrap_content"
  41. android:layout_below="@id/edit"
  42. android:text="@string/btn"
  43. />
  44. </RelativeLayout>

代码下载:http://files.cnblogs.com/android100/TTS.zip

Android自带的TTS功能的更多相关文章

  1. Android自带的分享功能案例

    MainActivity的代码 package com.hpsvse.weiboshare; import java.io.File; import android.net.Uri; import a ...

  2. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  3. 调用Android自带日历功能

    Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android ...

  4. 记一次使用 android 自带 WebView 做富文本编辑器之API、机型的兼容及各种奇葩bug的解决

    转载请声明出处(http://www.cnblogs.com/linguanh/) 目录 1,测试设备介绍 2,开源项目richeditor及CrossWalk的选择 3,遇到的bug及其解决方法 4 ...

  5. 采用busybox 代替android 自带的shell

    折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心.看一下怎么把渺小的toolbox替换成伟大的busybox吧.先大致描述一下Android系统中的she ...

  6. Android自带语音播报+讯飞语音播报封装(直接用)

    一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...

  7. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  8. 【Android】13.1 用Android自带的API访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...

  9. 假设做一个精美的Login界面(攻克了一EditText自带clear的功能,相似iphone的UITextField)

    先上图:     XML为: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

随机推荐

  1. bash if 表达式含义

    [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ ...

  2. Spring ActiveMQ Caused By: javax.jms.IllegalStateException: Connection closed

    根据 http://www.cnblogs.com/yshyee/p/7448808.html 进行JMS操作时,发送跟监听放到不同的项目中进行时,出现以下异常信息: org.springframew ...

  3. postman添加权限验证

    Basic Auth 输入用户名和密码,点击 Update Request 生成 authorization header 一种身份验证   分类: postman学习笔记

  4. Java中经常使用缓存Cache机制的实现

    缓存,就是将程序或系统常常要调用的对象存在内存中,一遍其使用时能够高速调用,不必再去创建新的反复的实例. 这样做能够降低系统开销.提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...

  5. UVALive - 4618 Wormholes(负环)

    题目大意:给出出发点和终点和m个虫洞(虫洞的出发点.终点,生成时间和花费时间).问从起点到终点花费的最小时间 解题思路:关键是有负环,所以直接跑最短路算法的话会TLE.所以负环要处理一下 可是这个负环 ...

  6. ReactNative调用aar文件(附:如何打开、查看aar文件内容)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7275897.html ReactNative可以用来进行一些嵌入式设备的操作终端开发,比如:ATM机.自动售卖 ...

  7. anagrams 查找序列里具有相同字符但顺序不同的单词

    [LeetCode] Anagrams   Given an array of strings, return all groups of strings that are anagrams. Not ...

  8. 【DB2】索引

    1. 索引的概念 1.1 索引的优点 索引是表的一个或多个列的键值的有序列表,创建索引的原因有2个: 确保一个或多个列中值的唯一性 提高对表进行的查询的性能.当查询时想要以更快的速度找到所需要的列,或 ...

  9. 全向轮运动学与V-rep中全向移动机器人仿真

    Wheeled mobile robots may be classified in two major categories, omnidirectional and nonholonomic. O ...

  10. linux下挂载VHD等虚拟磁盘文件

    1.RAW格式虚拟磁盘 linux下可以直接挂载raw格式的虚拟磁盘镜像文件. 例如,这里先用dd命令创建一个文件,然后将其格式化为ext4格式(只有一个分区),然后挂载到/mnt目录. 下面的raw ...