diff --git a/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt b/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt index f203b044a7c..42591849ec6 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/node/ContactsHandler.kt @@ -76,8 +76,8 @@ private object SystemContactsDataSource : ContactsDataSource { selection = null selectionArgs = null } else { - selection = "${ContactsContract.Contacts.DISPLAY_NAME_PRIMARY} LIKE ?" - selectionArgs = arrayOf("%${request.query}%") + selection = "${ContactsContract.Contacts.DISPLAY_NAME_PRIMARY} LIKE ? ESCAPE '\\'" + selectionArgs = arrayOf("%${escapeLikePattern(request.query)}%") } val sortOrder = "${ContactsContract.Contacts.DISPLAY_NAME_PRIMARY} COLLATE NOCASE ASC LIMIT ${request.limit}" resolver.query( @@ -247,6 +247,9 @@ private object SystemContactsDataSource : ContactsDataSource { } } + private fun escapeLikePattern(pattern: String): String = + pattern.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_") + private fun loadPhones(resolver: ContentResolver, contactId: Long): List { return queryContactValues( resolver = resolver,