From 5705be0d80aa5e8f9219457e6c4d2d9a2edea384 Mon Sep 17 00:00:00 2001 From: sspanak Date: Mon, 5 Aug 2024 17:22:58 +0300 Subject: [PATCH] patched an Android 9 SDK bug causing IllegalArgumentException when trying to destroy the SpeechRecognizer --- .../sspanak/tt9/ime/voice/VoiceInputOps.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/voice/VoiceInputOps.java b/app/src/main/java/io/github/sspanak/tt9/ime/voice/VoiceInputOps.java index 7371af69..31b57111 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/voice/VoiceInputOps.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/voice/VoiceInputOps.java @@ -108,8 +108,21 @@ public class VoiceInputOps { private void destroy() { this.language = null; - if (speechRecognizer != null) { - speechRecognizer.destroy(); + + // We try this multiple times, because it can fail due to a bug in the Android SDK + // https://github.com/sspanak/tt9/issues/593 + for (int i = 0; i < 3 && speechRecognizer != null; i++) { + try { + speechRecognizer.destroy(); + } catch (IllegalArgumentException e) { + if (i < 2) { + Logger.e(getClass().getSimpleName(), "SpeechRecognizer destroy failed. " + e.getMessage() + ". Retrying..."); + continue; + } else { + Logger.e(getClass().getSimpleName(), "SpeechRecognizer destroy failed. " + e.getMessage() + ". Giving up and just nulling the reference."); + } + } + speechRecognizer = null; Logger.d(getClass().getSimpleName(), "SpeechRecognizer destroyed"); }