Android(java)学习笔记117:英文朗诵android App编写实例

1.首先,我先把代码放到下面:

  1 package com.himi.speaker;
  2
  3 import java.util.Locale;
  4
  5 import android.app.Activity;
  6 import android.os.Bundle;
  7 import android.view.Menu;
  8 import android.view.MenuItem;
  9 import android.view.View;
 10 import android.view.View.OnClickListener;
 11 import android.widget.Button;
 12 import android.widget.EditText;
 13 import android.widget.Toast;
 14 import android.speech.tts.TextToSpeech;
 15
 16
 17 public class MainActivity extends Activity implements OnClickListener  {
 18
 19     private Button  btn_speak;
 20     private EditText edit_input;
 21     private TextToSpeech tts;
 22
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         setContentView(R.layout.activity_main);
 27
 28         tts = new TextToSpeech(this, ttsInitListener);
 29         edit_input = (EditText) findViewById(R.id.edit_input);
 30         btn_speak = (Button) findViewById(R.id.btn_speak);
 31
 32         btn_speak.setOnClickListener(this);
 33     }
 34
 35     @Override
 36     public boolean onCreateOptionsMenu(Menu menu) {
 37         // Inflate the menu; this adds items to the action bar if it is present.
 38         getMenuInflater().inflate(R.menu.main, menu);
 39         return true;
 40     }
 41
 42     @Override
 43     public boolean onOptionsItemSelected(MenuItem item) {
 44         // Handle action bar item clicks here. The action bar will
 45         // automatically handle clicks on the Home/Up button, so long
 46         // as you specify a parent activity in AndroidManifest.xml.
 47         int id = item.getItemId();
 48         if (id == R.id.action_settings) {
 49             return true;
 50         }
 51         if (id == R.id.version) {
 52             Toast.makeText(getApplicationContext(), "这是首版本v1.0\n制作者:任逍遥",Toast.LENGTH_LONG).show();;
 53         }
 54         if (id == R.id.exit) {
 55             finish();
 56         }
 57         return super.onOptionsItemSelected(item);
 58     }
 59
 60     public void onClick(View v) {
 61
 62         if(edit_input.getText().length() >0 ) {
 63             //朗诵输入文本
 64             tts.speak(edit_input.getText().toString(), TextToSpeech.QUEUE_FLUSH,null );
 65
 66
 67         }else {
 68             tts.speak("Nothing input,Son of a bitch", TextToSpeech.QUEUE_FLUSH,null );
 69         }
 70
 71     }
 72
 73 //实现这个接口,这是手机发声的朗诵引擎,就像汽车发动机一样,启动运行.用来前面初始化创建TextToSpeech对象的,绑定这个接口实现这个对象可以具备发声的能力
 74     private TextToSpeech.OnInitListener ttsInitListener = new TextToSpeech.OnInitListener() {
 75         public void onInit(int status) {
 76             // 使用美式时区目前不支持中文语音数据库
 77             Locale loc = new Locale("us", "", "");
 78             // 判断是否安装了美式英文朗诵Text-to-Speech Library
 79             if (tts.isLanguageAvailable(loc) == TextToSpeech.LANG_AVAILABLE) {
 80                 tts.setLanguage(loc);
 81             }
 82
 83         }
 84     };
 85
 86
 87     //OnUtteranceCompletedListener-----API15之后就废弃了
 88
 89 //    private TextToSpeech.OnUtteranceCompletedListener ttsUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() {
 90 //
 91 //        public void onUtteranceCompleted(String utteranceId) {
 92 //            // TODO 自动生成的方法存根
 93 //
 94 //        }
 95 //    };
 96
 97
 98     protected void OnDestory() {
 99         tts.shutdown();
100         super.onDestroy();
101
102     }
103
104
105 }

接着我附上activity_main.xml:

 1 <LinearLayout 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     android:orientation="vertical"
 6     tools:context="com.himi.speaker.MainActivity" >
 7
 8     <EditText
 9         android:id="@+id/edit_input"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:lines="1"
13         android:hint="@string/input"/>
14     <Button
15         android:id="@+id/btn_speak"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:text="@string/speak"/>
19
20
21 </LinearLayout>

下图是在虚拟机上运行效果图的:

这里发现我在虚拟机上可以运行,比如输入"I love you",确实发出英文朗读,但是我把这段程序下载到手机真机上就不能实现朗诵了,我猜想是真机没有安装这里的TextToSpeech Library这个语言数据库文件,后来我就修改了一段程序试着验证我的猜想:如下:

package com.himi.speaker;

import java.util.Locale;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.speech.tts.TextToSpeech;

public class MainActivity extends Activity implements OnClickListener  {

    private Button  btn_speak;
    private EditText edit_input;
    private TextToSpeech tts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tts = new TextToSpeech(this, ttsInitListener);
        edit_input = (EditText) findViewById(R.id.edit_input);
        btn_speak = (Button) findViewById(R.id.btn_speak);

        btn_speak.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        if (id == R.id.version) {
            Toast.makeText(getApplicationContext(), "这是首版本v1.0\n制作者:任逍遥",Toast.LENGTH_LONG).show();;
        }
        if (id == R.id.exit) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

    public void onClick(View v) {

        if(edit_input.getText().length() >0 ) {
            //朗诵输入文本
            tts.speak(edit_input.getText().toString(), TextToSpeech.QUEUE_FLUSH,null );

        }else {
            tts.speak("Nothing input,Son of a bitch", TextToSpeech.QUEUE_FLUSH,null );
        }

    }

//实现这个接口,这是手机发声的朗诵引擎,就像汽车发动机一样,启动运行.用来前面初始化创建TextToSpeech对象的,绑定这个接口实现这个对象可以具备发声的能力
    private TextToSpeech.OnInitListener ttsInitListener = new TextToSpeech.OnInitListener() {
        public void onInit(int status) {
            // 使用美式时区目前不支持中文语音数据库
            Locale loc = new Locale("us", "", "");
            // 判断是否安装了美式英文朗诵Text-to-Speech Library
            if (tts.isLanguageAvailable(loc) == TextToSpeech.LANG_AVAILABLE)             {
                tts.setLanguage(loc);
            }            else //如果我的手机没有安装语音数据,程序点击进入之后,就会自动结束            {                 finish();            }          

        }
    };

    //OnUtteranceCompletedListener-----API15之后就废弃了

//    private TextToSpeech.OnUtteranceCompletedListener ttsUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() {
//
//        public void onUtteranceCompleted(String utteranceId) {
//            // TODO 自动生成的方法存根
//
//        }
//    };

    protected void OnDestory() {
        tts.shutdown();
        super.onDestroy();

    }

}

事实上,我的在真机上,点击进入之后,确实是直接退出程序。

2.于是,我在手机(小米3)中安装了:SpeechSynthesis Data这个语音数据,安装完了之后

进入:设置 / 全部设置 / 辅助功能 / 文字转语音(TTS)输出

设置完毕之后,手机即可发声.

时间: 2024-10-07 15:34:19

Android(java)学习笔记117:英文朗诵android App编写实例的相关文章

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很