From bd9d3838ce1fabdd5bea5420deba41a4e167998e Mon Sep 17 00:00:00 2001 From: Acerchicken Date: Sun, 11 Oct 2026 21:33:48 +0700 Subject: [PATCH] fix: restore voice_interaction_service when ROM leaves it empty On ColorOS 16 the assistant role is held by Google but voice_interaction_service is left empty (and cleared on every reboot), so no VoiceInteractionService runs and showSessionFromSession always returns false ("Trigger failed!"). Before triggering, restore voice_interaction_service (and voice_recognition_service if empty) from the assistant setting when WRITE_SECURE_SETTINGS is granted via adb, then retry while the service binds. Without the permission, show a hint toast instead. Co-Authored-By: Claude Opus 5.5 --- README.md | 1 + README_en.md | 1 + app/src/main/AndroidManifest.xml | 13 +++- .../micts/ui/activity/MainActivity.kt | 64 ++++++++++++++++++- app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 79 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f3c051b..cf5cc8e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ 2. 安装并打开MiCTS - 如果幸运的话,在不需要root的情况下,打开MiCTS就会直接触发圈定即搜 + - 如果提示`助理服务未运行`(例如ColorOS 16每次重启都会清空`voice_interaction_service`),执行一次`adb shell pm grant com.parallelc.micts android.permission.WRITE_SECURE_SETTINGS`(如果被拒绝,例如ColorOS国行版,可改为使用`adb install -r -g MiCTS.apk`重新安装),之后MiCTS会自动恢复助理服务 - 如果没有反应,大概率是因为Google对你的设备禁用了圈定即搜功能(可以通过在Logcat日志中查找`Omni invocation failed: not enabled`确认),在有root的情况下,可以尝试以下方法: - 在LSPosed里激活模块,在[MiCTS设置](#进入设置的方式)里开启`Google机型伪装`后,强制重启Google - 如果还是不行,使用[GMS-Flags](https://github.com/polodarb/GMS-Flags),将`com.google.android.apps.search.omnient.device`的flag`45631784`设为true diff --git a/README_en.md b/README_en.md index c1713b5..9f0a7e4 100644 --- a/README_en.md +++ b/README_en.md @@ -15,6 +15,7 @@ Trigger Circle to Search on any Android 9–16 device 2. Install and launch MiCTS - If you're lucky, Circle to Search will be triggered directly without root when launching MiCTS + - If it shows `Assistant service not running` (e.g. ColorOS 16, where `voice_interaction_service` is cleared on every reboot), run once `adb shell pm grant com.parallelc.micts android.permission.WRITE_SECURE_SETTINGS` (if it is denied, e.g. on ColorOS CN, reinstall with `adb install -r -g MiCTS.apk` instead), then MiCTS will restore the assistant service automatically - If nothing happened, most likely it's because Google disabled Circle to Search for your device (you can confirm by checking the message `Omni invocation failed: not enabled` in Logcat). Try the following **with root**: - Activate the module in LSPosed, enable `Device spoof for Google` in the [MiCTS settings](#how-to-enter-settings), and force restart Google - If it still doesn't work, then change `com.google.android.apps.search.omnient.device` flag `45631784` to true using [GMS-Flags](https://github.com/polodarb/GMS-Flags) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 44de1fa..5bd298f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,18 @@ - + + + + + + + + + )") + return false + } + Settings.Secure.putString(resolver, "voice_interaction_service", assistant) + if (Settings.Secure.getString(resolver, "voice_recognition_service").isNullOrEmpty()) { + context.packageManager.queryIntentServices( + Intent(RecognitionService.SERVICE_INTERFACE).setPackage(component.packageName), + PackageManager.MATCH_DISABLED_COMPONENTS + ).firstOrNull()?.serviceInfo?.let { + Settings.Secure.putString(resolver, "voice_recognition_service", ComponentName(it.packageName, it.name).flattenToString()) + } + } + Log.i(LOG_TAG, "restored voice_interaction_service to $assistant") + true + }.onFailure { e -> + Log.e(LOG_TAG, "restoreVoiceInteractionService failed: " + e.stackTraceToString()) + }.getOrDefault(false) +} + +fun isVoiceInteractionServiceMissing(context: Context): Boolean { + return runCatching { + val resolver = context.contentResolver + Settings.Secure.getString(resolver, "voice_interaction_service").isNullOrEmpty() && + !Settings.Secure.getString(resolver, "assistant").isNullOrEmpty() + }.getOrDefault(false) +} + class MainActivity : ComponentActivity() { suspend fun delayAndTrigger(delayMs: Long, vibrate: Boolean) { + val restored = restoreVoiceInteractionService(this) if (delayMs > 0) { delay(delayMs) } - if (!triggerCircleToSearch(1, this, vibrate)) { - Toast.makeText(this, getString(R.string.trigger_failed), Toast.LENGTH_SHORT).show() + var result = triggerCircleToSearch(1, this, vibrate) + // The service binds asynchronously after the setting changes, retry until it is ready + var retries = if (restored) 20 else 0 + while (!result && retries-- > 0) { + delay(100) + result = triggerCircleToSearch(1, this, vibrate) + } + if (!result) { + if (isVoiceInteractionServiceMissing(this)) { + Toast.makeText(this, getString(R.string.voice_interaction_service_missing), Toast.LENGTH_LONG).show() + } else { + Toast.makeText(this, getString(R.string.trigger_failed), Toast.LENGTH_SHORT).show() + } } finish() } diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 41549fa..ccf7bfc 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -4,6 +4,7 @@ Kích hoạt tính năng Tìm kiếm vòng tròn trên bất kỳ thiết bị Android 9–16 Cài đặt Kích hoạt thất bại! + Dịch vụ trợ lý chưa chạy. Hãy cấp quyền WRITE_SECURE_SETTINGS qua adb Cài đặt ứng dụng Độ trễ kích hoạt mặc định Độ trễ kích hoạt của ô lối tắt diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index b3c7024..e40df08 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -4,6 +4,7 @@ 在任意Android 9–16设备上触发圈定即搜(Circle to Search)功能 设置 触发失败! + 助理服务未运行,请通过adb授予WRITE_SECURE_SETTINGS权限 应用设置 默认触发延迟 磁贴触发延迟 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c32a77..738a2bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ Trigger Circle to Search on any Android 9–16 device Settings Trigger failed! + Assistant service not running. Grant WRITE_SECURE_SETTINGS via adb App Settings Default trigger delay Tile trigger delay