導航:首頁 > 操作系統 > android通訊錄字母排序

android通訊錄字母排序

發布時間:2022-06-02 15:04:29

android聯系人排序用了什麼演算法

今天用了整整一下午去搗鼓這塊,為什麼模擬器上可以按拼音排序,中英文混排,及按字母搜索聯系人,但到了開發板(平台是根據android2.2改過的)上就怎麼不行了呢,雖然現在還沒有解決,但也是知道了問題所在,離解決之路也就不遠了
好吧,現在就解釋下android2.2是怎麼按拼音排序的。

首先我們來看下android.2自帶通訊錄的資料庫文件contacts2.db的raw_contacts表。用sqlitedbviewer工具打開後可以看到有這么一個欄位:sort_key(sort_key_alt與之相似,只不過是英文環境下有個按given name還是first name排序的問題)。

正常狀況下,我們新建一個聯系人的話,如果是英文,則sort_key與display_name欄位顯示相同,如果輸入姓名是中文,如「你好」,sort_key則會顯示「ni 你 hao 好」,這樣開發者既可以根據此欄位按拼音排序,中英文混排,以及按拼音搜索聯系人拉。

現在就說下,android是如何將中文名的聯系人轉化為拼音存到sort_key裡面的:

view plain to clipboardprint?
if (displayNameStyle == FullNameStyle.CHINESE ||
displayNameStyle == FullNameStyle.CJK) {
sortKeyPrimary = sortKeyAlternative =
ContactLocaleUtils.getIntanc).getSortKe(displayNamePrimary, displayNameStyle);}
if (displayNameStyle == FullNameStyle.CHINESE ||
displayNameStyle == FullNameStyle.CJK) { sortKeyPrimary =
sortKeyAlternative =
ContactLocaleUtils.getIntanc).getSortKe(displayNamePrimary,
displayNameStyle);}
這段代碼是運行在contactsprovi2.java的updateRawContactDisplayName()方法裡面,這段代碼我們用到了ContactLocaleUtils.java這個類,所以我們進入它以後最顯眼的就是ChineseContactUtils這個ContactLocaleUtils的子類,它重寫了ContactLocaleUtils的getSortKey()方法,如下:

view plain to clipboardprint?
public String getSortKey(String displayName) {

ArrayList tokens = HanziToPinyin.getInstance().get(displayName);

if (tokens != null && tokens.size() > 0) {

StringBuilder sb = new StringBuilder();

for (Token token : tokens) {

// Put Chinese character's pinyin, then proceed with the

// character itself.

if (Token.PINYIN == token.type) {

if (sb.length() > 0) {

sb.append(' ');

}

sb.append(token.target);

sb.append(' ');

sb.append(token.source);

} else {

if (sb.length() > 0) {

sb.append(' ');

}

sb.append(token.source);

}

}

return sb.toString();

}

return super.getSortKey(displayName);

}
public
String getSortKey(String displayName) {
ArrayList tokens =
HanziToPinyin.getInstance().get(displayName); if (tokens !=
null && tokens.size() > 0) { StringBuilder
sb = new StringBuilder(); for (Token token : tokens) {
// Put Chinese character's pinyin, then proceed
with the // character itself.
if (Token.PINYIN == token.type) { if
(sb.length() > 0) { sb.append(' ');
} sb.append(token.target);
sb.append(' ');
sb.append(token.source); } else {
if (sb.length() > 0) {
sb.append(' '); }
sb.append(token.source); } }
return sb.toString(); } return
super.getSortKey(displayName); }
首先我們看 ArrayList tokens = HanziToPinyin.getInstance().get(displayName);,因為其他的無非就是插入格式的問題,我們暫時不用看。

android如何將漢字轉為拼音的?這就用到了HanziToPinyin這個類,好吧,我們先看下HanziToPinyin的getInstance()方法:

view plain to clipboardprint?
public static HanziToPinyin getInstance() {

synchronized(HanziToPinyin.class) {

if (sInstance != null) {

return sInstance;

}

// Check if zh_CN collation data is available

final Locale locale[] = Collator.getAvailableLocales();

for (int i = 0; i < locale.length; i++) {

if (locale[i].equals(Locale.CHINA)) {

sInstance = new HanziToPinyin(true);

return sInstance;

}

}

Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");

sInstance = new HanziToPinyin(false);

return sInstance;

}

}
public static HanziToPinyin getInstance() {
synchronized(HanziToPinyin.class) { if (sInstance != null) {
return sInstance; } // Check
if zh_CN collation data is available final Locale locale[]
= Collator.getAvailableLocales(); for (int i = 0; i <
locale.length; i++) { if
(locale[i].equals(Locale.CHINA)) { sInstance = new
HanziToPinyin(true); return sInstance;
} } Log.w(TAG, "There is no Chinese
collator, HanziToPinyin is disabled"); sInstance = new
HanziToPinyin(false); return sInstance; } }
現在說下我的開發板為什麼不能轉拼音;就是因為final Locale locale[] = Collator.getAvailableLocales()的Locale沒有一項equals(Locale.CHINA),所以到時候解決了這項,聯系人的按拼音排序也就解決了,如果大家不想用系統自帶的,自己可以下載個pinyin4j.jar包自己實現吧。

好吧,繼續:

看方法名也只到,這個方法返回一個HanziToPinyin實例,我仔細研究了HanziToPinyin的構造方法,無論純如的布爾值是false還是true都不影響,返回的都一樣,只不過這個方法的Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");可以提示是否支持漢字轉拼音,如果不能,android就會將displayname原封不動的插入sort_key裡面,如果能,就是剛才我說的 如「你好」,sort_key則會顯示「ni 你 hao 好」,這種形式,具體的如何轉拼音就是get()方法拉,直接插代碼:

view plain to clipboardprint?
public ArrayList get(final String input) {
ArrayList tokens = new ArrayList();
if (!mHasChinaCollator || TextUtils.isEmpty(input)) {
// return empty tokens.
return tokens;
}
final int inputLength = input.length();
final StringBuilder sb = new StringBuilder();
int tokenType = Token.LATIN;
// Go through the input, create a new token when
// a. Token type changed
// b. Get the Pinyin of current charater.
// c. current character is space.
for (int i = 0; i < inputLength; i++) {
final char character = input.charAt(i);
if (character == ' ') {
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
} else if (character < 256) {
if (tokenType != Token.LATIN && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = Token.LATIN;
sb.append(character);
} else if (character < FIRST_UNIHAN) {
if (tokenType != Token.UNKNOWN && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = Token.UNKNOWN;
sb.append(character);
} else {
Token t = getToken(character);
if (t.type == Token.PINYIN) {
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokens.add(t);
tokenType = Token.PINYIN;
} else {
if (tokenType != t.type && sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
tokenType = t.type;
sb.append(character);
}
}
}
if (sb.length() > 0) {
addToken(sb, tokens, tokenType);
}
return tokens;
}

㈡ 安卓2.1系統索愛U20i手機安裝了搜狗輸入法但是不能用通訊錄不是按照字母排列

你的這款手機 我不熟悉 不過是安卓系統的話就應該能用的 是不是設置上有點問題 耐心哈

㈢ 求android讀取通訊錄並按字母排序demo

酷派手機官方自帶的就是這樣的

㈣ 華為p30通訊錄怎麼設置字母排序

有時候我們在使用華為p30的時候,想開啟或者關閉應用通訊錄許可權,怎麼操作呢,下面來分享一下方法

華為p30通訊錄許可權設置方法

第一步打開華為p30,點擊桌面的設置,如下圖所示:



第二步在華為p30設置界面,點擊應用->許可權管理,如下圖所示:





第三步在華為p30許可權管理中,點擊頂部許可權,選擇通訊錄,如下圖所示:



第四步進去華為p30通訊錄之後,看到通訊錄有兩種許可權,一種是讀取,一種是增刪改,如下圖所示:



第五步我們可以分別對通訊錄的兩種許可權進行設置,進去之後,可以開啟或者關閉華為p30應用的通訊錄許可權,如下圖所示:





推薦閱讀:

華為p30 pro如何分屏?華為p30 pro應用分屏教程

華為p30pro怎麼截屏?華為p30pro三種截屏/截圖教程

華為p30 pro怎麼關閉後台應用?華為p30 pro關閉後台應用教程

以上就是本篇文章的全部內容了,希望對各位有所幫助。如果大家還有其他方面的問題,可以留言交流,請持續關注腳本之家!

㈤ 手機通訊錄能否設成按常用順序排列

那要看你用的是什麼手機了,一般的手機是可以的 字母排列 筆畫排列 有的手機是可以把常用的 排列在前 手機功能不一樣 語音撥號 很多多

㈥ 小米手機通訊錄姓名是按英文單詞順序排的嗎可以設置開頭姓名嗎

你好!
一般安卓的通訊錄都是以字母順序排列的從A到Z,如果開頭設置的第一個字的拼音是A那就排在首位,比如阿這個字就會在通訊錄的第一位,
打字不易,採納哦!

㈦ 手機通訊錄(電話本)中的聯系人是按什麼先後順序排列的有什麼規律嗎

按英文26個字母排序的A:B:白…C:陳、常…D:鄧、丁等等

㈧ 安卓或者華為手機常用聯系人的排序規則是如何規定的

聯系人是按照姓氏的首字母順序排列的,不是按通話記錄排列的。

閱讀全文

與android通訊錄字母排序相關的資料

熱點內容
windows拷貝到linux 瀏覽:751
mdr軟體解壓和別人不一樣 瀏覽:884
單片機串列通信有什麼好處 瀏覽:320
游戲開發程序員書籍 瀏覽:843
pdf中圖片修改 瀏覽:269
匯編編譯後 瀏覽:474
php和java整合 瀏覽:829
js中執行php代碼 瀏覽:442
國產單片機廠商 瀏覽:57
蘋果手機怎麼設置不更新app軟體 瀏覽:284
轉行當程序員如何 瀏覽:493
蘋果id怎麼驗證app 瀏覽:864
查看手機命令 瀏覽:953
抖音反編譯地址 瀏覽:226
如何加密軟體oppoa5 瀏覽:233
java從入門到精通明日科技 瀏覽:96
拆解汽車解壓視頻 瀏覽:598
新版百度雲解壓縮 瀏覽:593
android上下拉刷新 瀏覽:880
centos可執行文件反編譯 瀏覽:839