美文网首页
Android系统如何获取手机中的联系人

Android系统如何获取手机中的联系人

作者: 弱小口 | 来源:发表于2017-03-13 14:37 被阅读0次

    Android是将联系人信息存储在Sqlite数据库中的,如果想知道Sqlite的详细信息可以参考http://www.cnblogs.com/luxiaofeng54/archive/2011/03/15/1985183.html这篇文章。
    首先,看一下联系人表contacts

    contact.png

    这张图中的内容就是contacts表的内容,其中我们常用的有_id和display_name。
    在Andriod中提供了获取这一信息的接口Resolver,通过Resolver可以对共享的内容进行解读。Resolver可以理解为内容解析器。
    其代码实现如下:
    <pre>
    ContentResolver contentResolver = this.getContentResolver();
    Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null)
    </pre>
    public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)有五个参数
    第一个参数uri,Uri是Provide的标识,这里指联系人这个Provide的标识。android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者
    第二个参数projection,这个参数告诉Provider要返回的内容(列Column),比如Contacts Provider提供了联系人的ID和联系人的NAME等内容,如果我们只需要NAME,那么我们就应该使用new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}。用null表示返回Provider的所有内容(列Column)。
    第三个参数selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。如果我们只想返回名称为张三的数据,第三个参数应该设置为:android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='张三'"
    第四个参数selectionArgs,这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?(android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?"),那么你在selectionArgs写的数据就会替换掉?(new String[]{"张三"})。
    第五个参数,sortOrder,按照什么进行排序,相当于SQL语句中的Order by。
    下面再看一下联系人表data

    data.png

    其中mimetype_id列的内容如下:

    mimetype.png

    从表data可以看出,name,phone number,email存储的方式是一样的,都是data1,后面的data是更详细的信息,区分name,phone number,email 的唯一方式是mimetype_id,区分联系人的唯一标识是raw_contact_id,这个值是从上面的表contacts的_id获取的。所以要想获取联系人的所有信息,需要先通过contacts表获取联系人ID,然后根据联系人的ID在表data获取想要的内容。
    下面是获取联系人详细信息的源码:
    <pre>
    public void fetchContactInformation() {
    String id;
    String mimetype;
    ContentResolver contentResolver = this.getContentResolver();
    //只需要从Contacts中获取ID,其他的都可以不要,通过查看上面编译后的SQL语句,可以看出将第二个参数
    //设置成null,默认返回的列非常多,是一种资源浪费。
    Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
    new String[]{android.provider.ContactsContract.Contacts._ID}, null, null, null);
    while(cursor.moveToNext()) {
    id=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));

            //从一个Cursor获取所有的信息
            Cursor contactInfoCursor = contentResolver.query(
                    android.provider.ContactsContract.Data.CONTENT_URI,
                    new String[]{android.provider.ContactsContract.Data.CONTACT_ID,
                            android.provider.ContactsContract.Data.MIMETYPE,
                            android.provider.ContactsContract.Data.DATA1
                    },
                    android.provider.ContactsContract.Data.CONTACT_ID+"="+id, null, null);
            while(contactInfoCursor.moveToNext()) {
                mimetype = contactInfoCursor.getString(
                        contactInfoCursor.getColumnIndex(android.provider.ContactsContract.Data.MIMETYPE));
                String value = contactInfoCursor.getString(
                        contactInfoCursor.getColumnIndex(android.provider.ContactsContract.Data.DATA1));
                if(mimetype.contains("/name")){
                    System.out.println("姓名="+value);
                } else if(mimetype.contains("/im")){
                    System.out.println("聊天(QQ)账号="+value);
                } else if(mimetype.contains("/email")) {
                    System.out.println("邮箱="+value);
                } else if(mimetype.contains("/phone")) {
                    System.out.println("电话="+value);
                } else if(mimetype.contains("/postal")) {
                    System.out.println("邮编="+value);
                } else if(mimetype.contains("/photo")) {
                    System.out.println("照片="+value);
                } else if(mimetype.contains("/group")) {
                    System.out.println("组="+value);
                }
            }
            System.out.println("*********");
            contactInfoCursor.close();
        }
        cursor.close();
    }
    

    </pre>

    相关文章

      网友评论

          本文标题:Android系统如何获取手机中的联系人

          本文链接:https://www.haomeiwen.com/subject/bdmfnttx.html