rainbow-android-app

语音播报

  • 简单介绍一下云助理的语音播报(TTS)功能:

    • 手动朗读

      用户可长按消息,选择“朗读”对该消息进行朗读、选择“停止”终止正在朗读的消息

    • 自动朗读

      频道设置开启“自动朗读”后,收到新消息时将该消息加入朗读列表队尾,顺序朗读列表第一条消息,朗读结束后移除,继续朗读下一条消息。

  • 遇到问题

    • 应用内悬浮窗

      要求自动朗读列表不为空时,在应用内各个界面均能显示一个悬浮窗,用于打开朗读列表,应用退出到后台时隐藏该悬浮窗。

      根据该要求,我们联想到一些管家、助手软件,会在桌面显示一个悬浮窗,进入应用时则隐藏,这与我们的要求正好相反!说明还是可以实现的嘛。

      1. 获取Application级的WindowManager

        WindowManager windowManager = getWindowManager(context.getApplicationContext());
        
      2. 添加悬浮窗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);
        
      3. 应用退到后台时隐藏

        判断应用退到后台可以使用Activity管理小节中提到的“记录各Activity状态”,当activity均为onStop时说明已退到后台,这时将悬浮窗移除即可:

        windowManager.removeView(smallWindow);
        
    • 内容格式问题

      我们使用百度TTS SDK来实现语音播报,在使用过程中我们发现,当存在连续的空字符时,会忽略空字符后的内容。为避免该问题,使用正则匹配替换连续的空字符为一个空格。