這個問題在 Android 的系統存在很久了, 有可能是因為在簡體中文沒這個問題, 正體中文使用者太少, 所以一直沒有修正.

在聯絡人的軟體中 (除非該軟體有自己做搜尋的處理, 而不是直接使用聯絡人儲存空間的功能), 只有由第一個中文字開始找, 或者是前面有空白的第一個中文字. 例如找 "客" 這個字的時候, 只會出現下面的結果:
Android 聯絡人中文搜尋修正

這可能是因為在外國人的習慣上, 找名字是用 "字" 的方式找, 而不是 "字母" 的方式, 例如 Word 這個字, 他們不會認為找 or 時應該出現 Word. 而是找 wo 時才應該出現 Word. 但是中文不太一樣, 我們會希望不管這個中文字出現在那個位置, 都應該會被找出來才對, 像是這樣:
Android 聯絡人中文搜尋修正

但是這個問題並不會存在於簡體中文的介面中, 可見在切換在簡體中文的情形下, 應該有特殊的處理. 果然在 ContactsProvider 的程式碼中, 有個 ContactLocaleUtils.java 中的 getNameLookupKeys(), 在判斷是簡體中文的環境, 就會使用 Pinyn (拼音) 建立 key 的方式來找, 這時在搜尋中文的時候, 不管那個字出現在那個位置, 都能被找出來.

由於在系統中, 都應該是用 unicode 在處理, 所以這個處理方式也應該適用於正體中文才對. 找了一下 shouldPreferSimplifiedChinese() 出現的地方, 這個函式就只用來判斷要不要使用 Pinyi 的方式來處理 NameLookupKey, 所以理論上直接改這個函式也在正體中文傳回 true 就能解決這個問題.

我在自己建立的 LineageOS 21 中加上了這個修正, 果然在正體中文的環境下修正了這個問題. 我在 AOSP 提交了這個 patch, 不過不確定會不會被接受, 就算 AOSP 接受這個修正, 也不確定其他的系統會不會拿去用. 如果你用的系統也有這個問題, 可以反應給他們, 加上這個修正來解決這個問題.

我另外寫了一個 xposed 的 ChineseContactSearchFix 模組, 如果你有使用 Xposed, 可以安裝這個模組, 也能解決這個問題.

使用上面那個模組後, 如果原本已存在的資料可能不會重建 key, 可能只有新建的資料才能這樣找. 這時可以在系統的介面切換到其他的語言再切換回來,就應該會使用 Pinyi 的方式重建這些 key, 這時再找尋就不會有問題了.
謝謝您的努力, 很可惜對大多數人而言,您的文字還是不好懂, 可以打包成APK 嗎?
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!