详解Android 语音播报实现方案(无SDK)
本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下:
功能描述
类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到“支付宝到账12.55元”的语音播报。
要解决的问题
1.播放单个语音文件
2.播放完单个语音文件之后立即播放下一条,这样才能连续
3.当多个完整的语音序列都需要播报时的处理(比如支付宝短时间内收到多条收款推送)
实现思路
1、播放单个文件选择MediaPlayer
首先创建一个MediaPlayer实例
MediaPlayer player = new MediaPlayer();
然后设置数据源,这里数据源从assets中获取,当然也可以将语音文件放在raw文件夹里
fd = FileUtils.getAssetFileDescription(path); player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
然后调用prepareAsync()方法,异步加载,并设置监听,加载完毕之后开始播放(与prepare方法区别开来)
player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } });
2、由于播放的语音文件不止一个,因此需要监听播放完成的状态,在播放完成之后播放下一条语音
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mp.reset(); counter[0]++; if (counter[0] < list.size()) { try { AssetFileDescriptor fileDescriptor = FileUtils.getAssetFileDescription(String.format("sound/tts_%s.mp3", list.get(counter[0]))); mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength()); mp.prepare(); } catch (IOException e) { e.printStackTrace(); latch.countDown(); } } else { mp.release(); latch.countDown(); } } });
3、短时间多次播报请求,开采用同步方式进行,一条播完播放下一条,这里采用synchronized + notifyAll() 实现,当然也可以用别的方法。
代码封装
功能代码分为两部分,一部分是语音序列组成的List,这里是VoiceTemplate;
一部分是播放的功能封装,接收List,然后播放语音,这里叫做VoiceSpeaker;
详细代码见文末。
代码使用
比如要播放“支付宝到账十二点一三元”,代码如下
final List<String> list = new VoiceTemplate() .prefix("success") .numString("12.13") .suffix("yuan") .gen(); VoiceSpeaker.getInstance().speak(list);
源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Android数据共享 sharedPreferences 的使用方法
这篇文章主要介绍了Android数据共享 sharedPreferences 的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解使用sharedpreferences,需要的朋友可以参考下2017-10-10Android GridView扩展仿微信微博发图动态添加删除图片功能
这篇文章主要为大家详细介绍了Android GridView扩展仿微信微博发图动态添加删除图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-05-05Android Activity启动模式之singleTask实例详解
这篇文章主要介绍了Android Activity启动模式之singleTask,结合实例形式较为详细的分析了singleTask模式的功能、使用方法与相关注意事项,需要的朋友可以参考下2016-01-01android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
这篇文章介绍了android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法,有需要的朋友可以参考一下2013-09-09Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能
这篇文章主要介绍了Android 类似UC浏览器的效果:向上滑动地址栏隐藏功能,需要的朋友可以参考下2017-12-12RecyclerView+CardView实现横向卡片式滑动效果
这篇文章主要为大家详细介绍了RecyclerView+CardView实现横向卡片式滑动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-01-01
最新评论