简单介绍一下云助理的语音播报(TTS)功能:
手动朗读
用户可长按消息,选择“朗读”对该消息进行朗读、选择“停止”终止正在朗读的消息
自动朗读
频道设置开启“自动朗读”后,收到新消息时将该消息加入朗读列表队尾,顺序朗读列表第一条消息,朗读结束后移除,继续朗读下一条消息。
遇到问题
应用内悬浮窗
要求自动朗读列表不为空时,在应用内各个界面均能显示一个悬浮窗,用于打开朗读列表,应用退出到后台时隐藏该悬浮窗。
根据该要求,我们联想到一些管家、助手软件,会在桌面显示一个悬浮窗,进入应用时则隐藏,这与我们的要求正好相反!说明还是可以实现的嘛。
获取Application级的WindowManager
WindowManager windowManager = getWindowManager(context.getApplicationContext());
添加悬浮窗View
FloatWindowSmallView smallWindow = new FloatWindowSmallView(context.getApplicationContext());
LayoutParams smallWindowParams = new WindowManager.LayoutParams();
smallWindowParams.type = WindowManager.LayoutParams.TYPE_PHONE;
smallWindowParams.format = PixelFormat.RGBA_8888;
smallWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
smallWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
smallWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
smallWindowParams.x = screenWidth;
smallWindowParams.y = screenHeight / 2;
smallWindow.setParams(smallWindowParams);
windowManager.addView(smallWindow, smallWindowParams);
应用退到后台时隐藏
判断应用退到后台可以使用Activity管理小节中提到的“记录各Activity状态”,当activity均为onStop时说明已退到后台,这时将悬浮窗移除即可:
windowManager.removeView(smallWindow);
内容格式问题
我们使用百度TTS SDK来实现语音播报,在使用过程中我们发现,当存在连续的空字符时,会忽略空字符后的内容。为避免该问题,使用正则匹配替换连续的空字符为一个空格。