在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. 【树莓派】服务配置相关2:基于RPi Desktop的服务配置

    该文接续之前写过的一篇:[树莓派]服务配置相关. 这是我个人用来进行树莓派盒子安装配置的脚本,对于外部其他博友,可以部分参考,但不需要逐个引用. 现在有一定更新,部分按如下脚本来操作: step1: ...

  2. javascript constrator and prototype

    揭开js之constructor属性的神秘面纱 在js里面当new了一个对象时,这中间发生了什么? MDN - new运算符 当代码 new foo(...) 执行时: 一个新对象被创建.它继承自fo ...

  3. mysql改变字符串的大小写

    INITCAP:转换每个字的第一个字符为大写LOWER:转换所有字符为小写UPPER:转换所有字符为人写 eg: LOWER(phone)

  4. IBM应该请我去做Domino产品设计架构师

                                  作者: 亓锋                         2012年11月19日16:56  来源: 速途专栏              ...

  5. Swift3 URL编码、解码用法addingPercentEncoding

    我们请求一个url时,最好要对其编码,转换成url识别的字符,以应对url里可能存在的中文.特殊符号等. swift3之前用法: url.stringByAddingPercentEscapesUsi ...

  6. windows 7 提示缺少D3DCOMPILER_47.dll的正确解决方法

    下载 KB4019990补丁 我上传一下吧. 点击下载

  7. git difftool 详解

    一.如何比较两个版本之间的差异 1.显示版本得到版本的commit id 2.执行difftool命令 按Y进行比较,我用的是DiffMerge这个软件对代码进行比较的 二.比较当前所修改的内容 gi ...

  8. git 错误信息 6 uncommitted changes would be overwritten by merge

    表示本地库有几个文件修改没有提交,说明本地有几个文件没有跟踪

  9. BOOST ASIO 学习专贴

    本文已于20170903更新完毕,所有boost asio 代码均为本人手抄.编译器为vs2013,并且所有代码已经上传,本文下方可下载源码 为了学习boost asio库,我是从boost的官方bo ...

  10. K均值算法

    为了便于可视化,样本数据为随机生成的二维样本点. from matplotlib import pyplot as plt import numpy as np import random def k ...