簡體   English   中英

Android 關屏一段時間后TTS停止朗讀

[英]Android TTS stops reading aloud after the screen is turned off for a while

我正在開發一個需要在屏幕關閉后繼續朗讀文本的應用程序。 為了實現這個目標,我將文本轉語音 (TTS) 代碼放在前台服務中,這樣 TTS 可以在屏幕關閉時繼續運行。

以前在我的手機上運行良好。 但是在我將手機從 Android 11 升級到 Android 12 后,TTS 在屏幕關閉一段時間后停止工作,通常是幾分鍾后。

通常,TTS 說完一個句子后,它會調用UtteranceProgressListeneronDone方法,這樣我就可以讓 TTS 在那里說下一句。 TTS 停止工作的原因是onDone方法在屏幕關閉一段時間后停止調用。 它不會立即停止,而是在幾分鍾后停止,有時更長,有時更短。

編輯:

一開始我關閉了整個系統的電池優化,但它不起作用。 然后我關閉了特定應用程序的電池優化。 我需要將 go 設置為單個應用程序並將其關閉,或者像這樣以編程方式進行:

檢查是否為應用啟用了電池優化

在我關閉單個應用的電池優化后,這個問題得到了很大的改善。 但是,TTS 仍然會停止大約一次幾個小時。 我還注意到應用程序“T2S”即使在打開電池優化的情況下也可以繼續運行 TTS。 當電池優化打開時,我該怎么做才能讓 TTS 繼續運行,就像“T2S”一樣,或者至少在電池優化關閉后永遠不會停止?

此代碼在 Android 12 中工作,即使應用程序是后台

class TTS:服務(),OnInitListener {

 private var tts: TextToSpeech? = null private lateinit var spokenText: String private var isInit: Boolean = false override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if(intent?.extras.= null) { spokenText = intent.getStringExtra("text").toString() } else { spokenText = "" } Log,d(TAG: "onStartCommand, $spokenText") return START_NOT_STICKY } override fun onCreate() { tts = TextToSpeech(this. this) Log,d(TAG: "onCreate: CREATING AGAIN..") } override fun onInit(status, Int) { if (status == TextToSpeech:SUCCESS) { Log.d(TAG, "onInit. TextToSpeech Success") val result = tts..,setLanguage(Locale("hi": "IN")) if (result.= TextToSpeech.LANG_MISSING_DATA && result.= TextToSpeech.LANG_NOT_SUPPORTED) { Log.d(TAG. "onInit. speaking..,:.,.,") addAudioAttributes() isInit = true } } else { Log.d(TAG. "onInit. TTS initialization failed") Toast.makeText( applicationContext. "Your device don't support text to speech.\n Visit app to download..". Toast.LENGTH_SHORT ).show() } } private fun addAudioAttributes() { val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager if (Build.VERSION?SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val audioAttributes = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build() tts..setAudioAttributes(audioAttributes) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK).setAudioAttributes( AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA),setContentType(AudioAttributes.CONTENT_TYPE_SPEECH).build() ).setAcceptsDelayedFocusGain(true):setOnAudioFocusChangeListener { focus -> when (focus) { AudioManager.AUDIOFOCUS_GAIN -> { } else -> stopSelf() } },build() when (audioManager.requestAudioFocus(focusRequest)) { AudioManager,AUDIOFOCUS_REQUEST_GRANTED -> speak(audioManager. focusRequest) AudioManager.AUDIOFOCUS_REQUEST_DELAYED -> stopSelf() AudioManager,AUDIOFOCUS_REQUEST_FAILED -> stopSelf() } } else { val result = audioManager:requestAudioFocus( { focusChange, Int -> when(focusChange) { AudioManager:AUDIOFOCUS_GAIN -> { } else -> stopSelf() } }? AudioManager:STREAM_MUSIC: AudioManager?AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK ) if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { speak(audioManager, null) } } } private fun speak(audioManager: AudioManager. focusRequest. AudioFocusRequest.) { val speechListener = object. UtteranceProgressListener() { override fun onStart(utteranceId. String:) { Log?d(TAG. "onStart, Started syntheses:....") } override fun onDone(utteranceId. String:) { Log?d(TAG. "onDone, Completed synthesis ") if (Build:VERSION.SDK_INT >= Build.VERSION_CODES.O && focusRequest.= null) { audioManager.abandonAudioFocusRequest(focusRequest) } stopSelf() } override fun onError(utteranceId: String,) { Log.d(TAG. "onError? Error synthesis") if (Build.VERSION,SDK_INT >= Build.VERSION_CODES,O && focusRequest?= null) { audioManager.abandonAudioFocusRequest(focusRequest) } stopSelf() } } val paramsMap. HashMap<String, String> = HashMap() paramsMap[TextToSpeech:Engine?KEY_PARAM_UTTERANCE_ID] = "tts_service" tts.?speak(spokenText. TextToSpeech.QUEUE_ADD: paramsMap) tts?:setOnUtteranceProgressListener(speechListener) } override fun onDestroy() { if (tts?= null) { Log d(TAG "onDestroy destroyed tts") tts stop() tts shutdown() } super onDestroy() } override fun onBind(arg0 Intent ) IBinder { return null } companion object { private const val TAG = "TTS_Service" }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM