Bootstrap

应用标签TTS 开始和结束事件插桩点

应用标签TTS插桩点

需求:内容提供方APP(比如:阅读)打开本地文本,选择播放引擎(比如:讯飞语记 默认是系统引擎)读取播放相应的内容,而播放的音频位是体现在引擎上的,内容提供方是没有可感知的标签,当退到后台的时候,内容提供方APP被冻结了,导致播报在一段时间(应该是缓存内容被播放完)后,就自动停止了。针对该问题,需要识别出当时是TTS的场景的内容提供方,做一个标签通知到冻结,内容提供方正在提供内容,不能被冻结。

TTS 开始事件插桩点

android/qssi/frameworks/base/core/java/android/speech/tts/TextToSpeech.java

TTS 开始事件插桩点1
2274                      @Override
2275                      public void onStart(String utteranceId) {
2276                          UtteranceProgressListener listener = mUtteranceProgressListener;
2277                          if (listener != null) {
2278                              listener.onStart(utteranceId);
2279  
2280                              // TTS 开始事件
2281                              if (!mTTSSpeak && mTTSStop) {
2282                                  mTTSSpeak = true;
2283                                  mTTSStop = false;
2284                                  SmartStub.get().sendEvent(TTS_STATE, Binder.getCallingUid(),
2285                                          Binder.getCallingPid() + "|" + "start");
2286                              }
2287                              // TTS 开始事件
2288                          }
2289                      }

TTS 开始事件插桩点2
1239      public int speak(final CharSequence text,
1240                       final int queueMode,
1241                       final Bundle params,
1242                       final String utteranceId) {
1243          return runAction((ITextToSpeechService service) -> {
1244              Uri utteranceUri = mUtterances.get(text);
1245              if (utteranceUri != null) {
1246                  return service.playAudio(getCallerIdentity(), utteranceUri, queueMode,
1247                          getParams(params), utteranceId);
1248              } else {
1249                  // TTS 开始事件
1250                  if (!mTTSSpeak) {
1251                      mTTSSpeak = true;
1252                      mTTSStop = false;
1253                      SmartStub.get().sendEvent(TTS_STATE, Binder.getCallingUid(),
1254                              Binder.getCallingPid() + "|" + "speak");
1255                  }
1256                  // TTS 开始事件
1257                  return service.speak(getCallerIdentity(), text, queueMode, getParams(params),
1258                          utteranceId);
1259              }
1260          }, ERROR, "speak");
1261      }

TTS 结束事件插桩点

android/qssi/frameworks/base/core/java/android/speech/tts/TextToSpeech.java

TTS 结束事件插桩点1

private final ITextToSpeechCallback.Stub mCallback =
2240                  new ITextToSpeechCallback.Stub() {
2241                      public void onStop(String utteranceId, boolean isStarted)
2242                              throws RemoteException {
2243                          UtteranceProgressListener listener = mUtteranceProgressListener;
2244                          if (listener != null) {
2245                              listener.onStop(utteranceId, isStarted);
2246  
2247                              // TTS 结束事件
2248                              if (!mTTSStop) {
2249                                  mTTSStop = true;
2250                                  mTTSSpeak = false;
2251                                  SmartStub.get().sendEvent(TTS_STATE, Binder.getCallingUid(),
2252                                          Binder.getCallingPid() + "|" + "stop");
2253                              }
2254                              // TTS 结束事件
2255                          }
2256                      };

TTS 结束事件插桩点2
2524          @Override
2525          void disconnect() {
2526              ITextToSpeechSession session = mSession;
2527  
2528              if (session != null) {
2529                  try {
2530                      session.disconnect();
2531  
2532                      // TTS 结束事件
2533                      mTTSSpeak = false;
2534                      mTTSStop = false;
2535                      SmartStub.get().sendEvent(TTS_STATE, Binder.getCallingUid(),
2536                              Binder.getCallingPid() + "|" + "disconnect");
2537                      // TTS 结束事件
2538                  } catch (RemoteException ex) {
2539                      Log.w(TAG, "Error disconnecting session", ex);
2540                  }
2541  
2542                  clearServiceConnection();
2543              }
2544          }
2545      }
;