应用标签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 }