Android通讯录搜索

使用ContentResolver

 
    在使用Google网页搜索功能时,只要输入几个字,就会在下方出现很多建议关键字。这次的范例,将以手机里的通讯录作为查询对象,并设计出一个类似建议的可能联系人。要使用类似建议完成功能的AutoCompleteViewWidget,以及示范如何使用ContentResolver来访问通讯录里联系人的关键字,并将所有找到的联系人存入CursorAdapter里。

     运行此范例前,通讯录里头必须要有一些数据,否则会造成程序为null的错误;运行的结果是输入搜索人员名字a,会将所有名字a开头的人名捞出来,当输入*,则是将所有通讯录的人名显示于AutoCompleteView的AdapterView里,若发生了User选择事件后,会将勾选的联系人电话号码显示于TextView,故此范例除了学会取得通讯录的联系人数据之外,了解如何读取ContentProvider里的联系人电话,也是重要课题之一。

效果图:

 


     要取得通讯录里的数据,则是使用ContentResolver对象(content),以content.query的方式取出所有通讯录里的联系人,并以Cursor的方式取得其存储内容(电话、姓名等)。在SDK2.1之后的联系人设置,可有多组电话"类型"与"电话",所使用的类对象为android.provider.Contacts,写法与前几版SDK有很大差别。最后设计AutoCompleteTextView.OnItemClickListener事件,这也是当User单击联系人姓名之后,所拦截的事件处理,在其中便以Contacts-Adapter.getCursor()方法取得联系人的电话号码。


Java代码:

  1. import android.content.ContentResolver;
  2. import android.database.Cursor;
  3. import android.provider.ContactsContract;
  4. import android.widget.AdapterView;
  5. import android.widget.AutoCompleteTextView;

  6. public class EX05_09 extends Activity {
  7. private AutoCompleteTextView myAutoCompleteTextView;
  8. private TextView myTextView1;
  9. private Cursor contactCursor;
  10. private ContactsAdapter myContactsAdapter;

  11. public static final String[] PEOPLE_PROJECTION = new String[]{
  12. ContactsContract.Contacts._ID,ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.Contacts.DISPLAY_NAME
  13. };


  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. myAutoCompleteTextView = (AutoCompleteTextView)findViewById(R.id.myAutoCompleteTextView);
  19. myTextView1 = (TextView)findViewById(R.id.myTextView1);

  20. ContentResolver content = getContentResolver();

  21. contactCursor = content.query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI,PEOPLE_PROJECTION, null, null, "" );

  22. myContactsAdapter = new ContactsAdapter(this, contactCursor);myAutoCompleteTextView.setAdapter(myContactsAdapter);myAutoCompleteTextView.setOnItemClickListener ( newAdapterView.OnItemClickListener() {

  23. @Override
  24. public void onItemClick(AdapterView arg0, View arg1, intarg2, long arg3) {

  25. Cursor c = myContactsAdapter.getCursor();

  26. c.moveToPosition(arg2);
  27. String number = c.getString ( c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER) );

  28. numbernumber = number == null ? "无输入电话" : number;myTextView1.setText ( c.getString ( c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME) )+ "的电话是" + number);
  29. }
  30. } );
  31. }

  32. }

src/irdc.ex05_09/ContactsAdapter.java

     继承CursorAdapter以cursor作为下拉菜单data的class,重写runQueryOnBackgroundThread这个方法,当输入*号时,将所有数据找出。

Java代码:

  1. import android.content.ContentResolver;
  2. import android.database.Cursor;
  3. import android.provider.ContactsContract;

  4. public class ContactsAdapter extends CursorAdapter {
  5. private ContentResolver mContent;
  6. public ContactsAdapter(Context context, Cursor c) {
  7. super(context, c);
  8. mContent = context.getContentResolver();
  9. }
  10. @Override
  11. public void bindView(View view, Context context, Cursor cursor){

  12. ((TextView) view).setText ( cursor.getString (cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME) ) );
  13. }

  14. @Override
  15. public View newView(Context context, Cursor cursor, ViewGroupparent) {
  16. final LayoutInflater inflater =LayoutInflater.from(context);
  17. final TextView view = (TextView)inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent,false);
  18. view.setText ( cursor.getString ( cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME) ) );
  19. return view;
  20. }

  21. @Override
  22. public String convertToString(Cursor cursor) {
  23. return cursor.getString ( cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME) );
  24. }
  25. @Override
  26. public Cursor runQueryOnBackgroundThread(CharSequenceconstraint) {
  27. if (getFilterQueryProvider() != null) {
  28. returngetFilterQueryProvider().runQuery(constraint);
  29. }
  30. StringBuilder buffer = null;
  31. String[] args = null;
  32. if (constraint != null) {
  33. buffer = new StringBuilder();
  34. buffer.append("UPPER(");
  35. buffer.append(ContactsContract.Contacts.DISPLAY_NAME);
  36. buffer.append(") GLOB ?");
  37. args = new String[] {
  38. constraint.toString().toUpperCase() + "*"
  39. };
  40. }
  41. return mContent.query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI,EX05_09.PEOPLE_PROJECTION, buffer == null ? null :buffer.toString(), args, "" );
  42. }

  43. }
复制代码


      AndroidManifest.xml

     将读取通讯录(Android.permission.READ_CONTACTS)的权限打开,否则,一运行程序就会发生异常。

Java代码:

复制代码


     这个范例介绍到搜索通讯录的方法,通过ContentResolver对象,也可以添加、修改及删除通讯录的人员信息,除了通讯录外,还可以访问诸如Audio、Video、Images的数据。

     添加public final Uri insert(Uri url,ContentValuesvalues),ContentValue.put(key,value)key为字段名称,value为添加的数据。

      修改public final int update(Uri uri, ContentValuesvalues, String where, String[] selectionArgs,where为sqlwhere后面的条件字符串,selectionArgs为where里的数据。

      删除public final int delete(Uri url, String where,String[] selectionArgs)。


通过ContentResolver还可以添加、修改、删除通讯录中的信息;并且通过它还可以访问audio、video、images等数据。相应方法展示如下:

添加:public final Uri insert(Uri uri,ContentValues values),ContentValue.put(key,value) ,其中key为字段名称,value为添加的数据。

修改:public final int update(Uri uri,ContentValues values,String where ,String[] selectionArgs),其中where为sql where 后面的条件字符串。selectionArgs为where里的数据。

删除:public final int delete(Uri uri,String where,String[] selectionArgs).

下面用代码介绍使用ContentValue.put()方法。通过程序添加通讯录里的联系人的资料。



你可能感兴趣的:(Android)