標籤:擷取手機連絡人 contract t9搜尋 android 撥號演算法
自己研究了好幾天連絡人的T9搜尋演算法, 先分享出來給大家看看. 歡迎指教.如果有大神有更好的T9搜尋演算法, 那更好啊,大家一起研究研究,謝謝.
第一部分是比較簡單的擷取手機連絡人.
擷取連絡人前提要有許可權.
<uses-permission android:name="android.permission.READ_CONTACTS" />
因為手機的連絡人都儲存在資料庫裡面,所以我們只要把資料庫裡的資訊查詢出來即可.
private static final String[] PHONES_PROJECTION = new String[] {
Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};
ContentResolver resolver = getBaseContext().getContentResolver();
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, null, null, null);
這裡我只是簡單的說一下而已,後面的遍曆phoneCursor 就能把連絡人查詢出來.(我項目裡是開一條線程擷取連絡人的,以防太多連絡人導致頁面空白或者卡頓)
第二部分是T9搜尋部分
思路是: a只要連絡人的號碼有包含我輸入的數字就add到list進去,
b連絡人的姓名拼音有包含我輸入的拼音就add到list進去,
c連絡人的姓名縮寫拼音有包含我輸入的拼音就add到list進去
舉個例子--連絡人姓名:測試,號碼:1234567890
情況一:我輸入1234567890就能把測試顯示出來
情況二:我輸入23744(ceshi),因為這個"測試"的拼音,所以也能把測試顯示出來
情況三:我輸入(27)cs,這是"測試"的拼音縮寫,所以也能把測試顯示出來
當然我輸入23(ce)或者744(shi)什麼的,都可以把測試顯示出來.
以上是我的思路,下面附上一段代碼
public class MainT9 extends Activity{private int[] textViewId = new int[]{R.id.main_num_1,R.id.main_num_2,R.id.main_num_3,R.id.main_num_4,R.id.main_num_5,R.id.main_num_6,R.id.main_num_7,R.id.main_num_8,R.id.main_num_9,R.id.main_num_left,R.id.main_num_0,R.id.main_num_right,R.id.main_num_delete};private TextView[] textView = new TextView[textViewId.length];private EditText inputEditText;private ListView mListView;private List<ContractBean> mList;private List<ContractBean> list;private MyAdapter myAdapter;private static final String[] PHONES_PROJECTION = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};long waitTime = 300; long touchTime = 0;/** * 判斷是否人為輸入 */private boolean isWrite = false;private boolean isAfresh = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);this.setContentView(R.layout.main_activity);mList = new ArrayList<ContractBean>();list = new ArrayList<ContractBean>();/** * 剛開始啟動程式時,開條線程去擷取連絡人 */new Thread(getContract).start();for(int i = 0;i<textViewId.length;i++){textView[i] = (TextView) this.findViewById(textViewId[i]);textView[i].setOnClickListener(click);}inputEditText = (EditText) this.findViewById(R.id.main_num_edit);//hideSystemKeyBoard(inputEditText);mListView = (ListView) this.findViewById(R.id.main_contract_listview);myAdapter = new MyAdapter(this, mList);mListView.setAdapter(myAdapter);inputEditText.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {// TODO Auto-generated method stubif (isWrite) {isWrite = false;return;}isWrite = true;String inputStr = "";String newStr = s.toString();newStr = newStr.replace(" ", "");int index = 0;if (true) {if ((index + 3) < newStr.length()) {inputStr += (newStr.substring(index, index + 3) + " ");index += 3;}}while ((index + 4) < newStr.length()) {inputStr += (newStr.substring(index, index + 4) + " ");index += 4;}inputStr += (newStr.substring(index, newStr.length()));inputEditText.setText(inputStr);inputEditText.setSelection(inputStr.length());if(count == 0){isAfresh = true;}else{isAfresh = false; }long currentTime = System.currentTimeMillis();if ((currentTime - touchTime) >= waitTime) {touchTime = currentTime;searchConstract(isAfresh);}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODO Auto-generated method stub}});}private void searchConstract(boolean isAfresh){if(isAfresh){if(mList!=null){myAdapter.updateListView(mList);}else{new Thread(getContract).start();}}else{String str1= inputEditText.getText().toString();str1 = str1.replace(" ", "");SearchContract search = new SearchContract(str1);search.start();}}/** * T9搜尋線程 * @author Chillax_KUN */class SearchContract extends Thread{String body;SearchContract(String body){this.body = body;}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();Iterator<ContractBean> iterator = mList.iterator();list = new ArrayList<ContractBean>();list.clear();while(iterator.hasNext()){ContractBean sortModel = iterator.next();String search = sortModel.getSearch();String phone = sortModel.getPhone();phone = phone.replace(" ", "");String zimu = sortModel.getZimu();if(phone.contains(body) || search.contains(body)||zimu.contains(body)){list.add(sortModel);}}h.sendEmptyMessage(1);}}/** * 開啟線程,擷取連絡人 */Runnable getContract = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmList = getPhoneContacts();h.sendEmptyMessage(0);}};private List<ContractBean> getPhoneContacts() {ContentResolver resolver = getBaseContext().getContentResolver();Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);List<ContractBean> mList = new ArrayList<ContractBean>();if (phoneCursor != null) {phoneCursor.moveToFirst();while (!phoneCursor.isAfterLast()) {ContractBean model = new ContractBean();String name = phoneCursor.getString(0);String phone = phoneCursor.getString(1);String search = phoneCursor.getString(2);model.setName(name);model.setPhone(phone);model.setSearch(getNum(search,false));String zimu = "";String str[] = search.split(" ");if(str.length>0){for(int i = 0;i<str.length;i++){if(str[i].length()==1){zimu = zimu + str[i];}}}model.setZimu(getNum(zimu,true));mList.add(model);phoneCursor.moveToNext();}if(phoneCursor!=null){phoneCursor.close();}return mList;}return mList;}/** * 將連絡人的姓名拼音全部轉化為數字 * @param 連絡人姓名拼音 * @return 姓名拼音對應數字 */public String getNum(String search, boolean status){String str = "";for(int i = 0;i<search.length();i++){String c = search.charAt(i)+"";if(c.equals("1")){str = str + "1";if(status){i = i + 1;}continue;}else if(c.equals("A")||c.equals("B")||c.equals("C")||c.equals("2")||c.equals("a")||c.equals("b")||c.equals("c")){str = str + "2";if(status){i = i + 1;}continue;}else if(c.equals("D")||c.equals("E")||c.equals("F")||c.equals("3")||c.equals("d")||c.equals("e")||c.equals("f")){str = str + "3";if(status){i = i + 1;}continue;}else if(c.equals("G")||c.equals("H")||c.equals("I")||c.equals("4")||c.equals("g")||c.equals("h")||c.equals("i")){str = str + "4";if(status){i = i + 1;}continue;}else if(c.equals("J")||c.equals("K")||c.equals("L")||c.equals("5")||c.equals("j")||c.equals("k")||c.equals("l")){str = str + "5";if(status){i = i + 1;}continue;}else if(c.equals("M")||c.equals("N")||c.equals("O")||c.equals("6")||c.equals("m")||c.equals("n")||c.equals("o")){str = str + "6";if(status){i = i + 1;}continue;}else if(c.equals("P")||c.equals("Q")||c.equals("R")||c.equals("S")||c.equals("7")||c.equals("p")||c.equals("q")||c.equals("r")||c.equals("s")){str = str + "7";if(status){i = i + 1;}continue;}else if(c.equals("T")||c.equals("U")||c.equals("V")||c.equals("8")||c.equals("t")||c.equals("u")||c.equals("v")){str = str + "8";if(status){i = i + 1;}continue;}else if(c.equals("W")||c.equals("X")||c.equals("Y")||c.equals("Z")||c.equals("9")||c.equals("w")||c.equals("x")||c.equals("y")||c.equals("z")){str = str + "9";if(status){i = i + 1;}continue;}else if(c.equals("0")){str = str + "0";if(status){i = i + 1;}continue;}}return str;};Handler h = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if(msg.what==0){if(mList!=null && myAdapter!=null){myAdapter.updateListView(mList);myAdapter.notifyDataSetChanged();}} else if(msg.what==1){myAdapter.updateListView(list);}}};OnClickListener click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.main_num_1:inputEditText.setText(inputEditText.getText()+"1");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_2:inputEditText.setText(inputEditText.getText()+"2");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_3:inputEditText.setText(inputEditText.getText()+"3");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_4:inputEditText.setText(inputEditText.getText()+"4");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_5:inputEditText.setText(inputEditText.getText()+"5");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_6:inputEditText.setText(inputEditText.getText()+"6");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_7:inputEditText.setText(inputEditText.getText()+"7");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_8:inputEditText.setText(inputEditText.getText()+"8");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_9:inputEditText.setText(inputEditText.getText()+"9");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_0:inputEditText.setText(inputEditText.getText()+"0");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_left:inputEditText.setText(inputEditText.getText()+"*");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_right:inputEditText.setText(inputEditText.getText()+"#");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_delete:String string = inputEditText.getText().toString();if(!string.equals("")){inputEditText.setText(string.subSequence(0, string.length()-1));inputEditText.setSelection(inputEditText.getText().toString().length());}break;default:break;}}};/** * 通過反射調用setShowSoftInputOnFocus(false) 來隱藏鍵盤。 用 InputType.TYPE_NULL方法,無法顯示光線標。 */private void hideSystemKeyBoard(View view) {this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);try {Class<EditText> cls = EditText.class;Method setSoftInputShownOnFocus;// 此方法為隱藏的需用java反射調用setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus",boolean.class);setSoftInputShownOnFocus.setAccessible(true);setSoftInputShownOnFocus.invoke((EditText) view, false);} catch (Exception e) {e.printStackTrace();}}}
源碼地址:http://download.csdn.net/detail/chillax_li/7467553
尊重原創, 轉載請註明出處:http://blog.csdn.net/chillax_li/article/details/29380615