Android操作联系人

在Content Provider中查询数据,需要知道以下信息
- 标识该Content Provider的URI
- 需要查询的数据字段的名称
- 字段中数据的类型
- 如果需要查询特定记录,name还需要知道该记录的ID值

ContentResolver.query()或 Activity.ManagedQuery()方法都可以完成查询功能,这两个方法使用的参数相同,都返回Cursor对象,其区别在于managedQeury()方法是Activity来管理Cursor生命周期。而Query()方法则需要程序员自己管理。
声明方式如下

contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) 

Uri:用于查询的Content Provider URI值
projection:由需要查询的列名组成的数组
selection:类似SQL中的where子句,用于增加条件来完成数据过滤
selectionArgs:用于替换selection中可以使用?表示的表示的变量值
sortOrder:类似SQL中的 ORDER BY子句,用于实现排序的功能
返回值:Cursor对象,它位于第一条记录之前,或者为null

步骤:

加入权限

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
  • 找出相关的URI
    public static Uri uri_raw_contacts = Uri.parse("content://com.android.contacts/raw_contacts");
    private static Uri uri_raw_contacts_ = ContactsContract.Contacts.CONTENT_URI; // 和上面等价

    public static Uri uri_data = Uri.parse("content://com.android.contacts/data");
    public static Uri uri_data_ = ContactsContract.Data.CONTENT_URI;

查询代码

  1. 查询出raw_contact表中的内容,把_id放到集合中
  2. 根据查出的_id到data里面查询相关的数据
  3. 根据data表里mimetype_id取查询数据
  4. 查询完成后把数据添加到集合中
    如:
public static List<Map<String, Object>> queryAllContacts(
        ContentResolver resolver) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Cursor c1 = resolver.query(uri_raw_contacts, null, null, null, null);
    while (c1.moveToNext()) {
        Map<String, Object> map = new HashMap<String, Object>();
        int _id = c1.getInt(c1.getColumnIndex("_id"));// 从data表中取出记录的_id编号
        map.put("_id", _id);// 存放到map里面
        // 查找data表
        Cursor c2 = resolver.query(uri_data, new String[] { "data1", "mimetype" }, "raw_contact_id = ?", new String[] { _id + "" }, null);    // 通过指定的_id找该联系人的所有数据
        while (c2.moveToNext()) {
            // 获取名字,电话号码, email
            String data1 = c2.getString(c2.getColumnIndex("data1"));
            String mimetype = c2.getString(c2.getColumnIndex("mimetype"));    //这儿得到的是mimetype的类型是string  而不是int
            if (mimetype.equals("vnd.android.cursor.item/name"))// 取出存放的电话号码的名字  这儿取出的类型是是字符串
            {
                map.put("name", data1);
            } else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
                if (!map.containsKey("phone"))// 第一次放的时候
                {
                    map.put("phone", data1);
                } else// 第二次放的时候
                {
                    String p = map.get("phone").toString();
                    map.put("phone", p + "&&" + data1);
                }
            } else if (mimetype.equals("vnd.android.cursor.item/email_v2"))// 取出邮件
            {
                if (!map.containsKey("email"))// 第一次放的时候
                {
                    map.put("email", data1);
                } else// 第二次放的时候
                {
                    String p = map.get("email").toString();
                    map.put("email", p + "&&" + data1);
                }
            }
        }
        list.add(map);
    }
    return list;
}  

注意:ContentResolver是在Activity或Fragment里面使用getContentResolver()得到的

添加数据

public static void addContact(ContentResolver contentResolver, MyContacts c) {
    // 先向raw_contact里面插入数据
    ContentValues values = new ContentValues();
    Uri newUri = contentResolver.insert(uri_raw_contacts, values);

    // 得到生成的ID
    long _id = ContentUris.parseId(newUri);

    // 然后用这个ID向data表里面插入数据
    values.clear();
    values.put("raw_contact_id", _id);
    values.put("data1", c.getName());
    values.put("data2", c.getName());
    // 定义类型
    values.put("mimetype", "vnd.android.cursor.item/name");
    contentResolver.insert(uri_data, values);

    // 插入电话号码
    values.clear();
    values.put("raw_contact_id", _id);
    values.put("data1", c.getPhone());
    values.put("mimetype", "vnd.android.cursor.item/phone_v2");
    contentResolver.insert(uri_data, values);

    // 插入邮箱
    values.clear();
    values.put("raw_contact_id", _id);
    values.put("data1", c.getEmail());
    values.put("mimetype", "vnd.android.cursor.item/email_v2");
    contentResolver.insert(uri_data, values);
} 

修改数据

public static void updateContact(ContentResolver contentResolver, MyContacts c) {
    // 先向raw_contact里面插入数据
    ContentValues values = new ContentValues();
    // 是新录入的数据(只要和名字有关的都要进行修改)
    values.put("display_name", c.getName());
    values.put("display_name_alt", c.getName());
    values.put("sort_key", c.getName());
    values.put("sort_key_alt", c.getName());
    contentResolver.update(uri_raw_contacts, values, "_id=?", new String[] { c.getId() + "" });
    // 修改data表
    values.clear();
    values.put("data1", c.getName());
    values.put("data2", c.getName());
    contentResolver.update(uri_data, values, "mimetype = ? and raw_contact_id = ?",    new String[] { "vnd.android.cursor.item/name", c.getId() + "" });// 确定正确raw_contact_id,区分类型
    // 修改电话号码
    values.clear();
    values.put("data1", c.getPhone());
    // values.put("data2", Phone.TYPE_HOME);
    contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/phone_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型
    // 修改电话邮箱
    values.clear();
    values.put("data1", c.getEmail());
    // values.put("data2", Email.TYPE_WORK);
    contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/email_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型
    System.out.println("------------修改成功");
}  

读取通话记录

public static Cursor getAllCalls(ContentResolver resolver) {
    Uri uri = Uri.parse("content://call_log/calls");
    System.out.println(CallLog.Calls.CONTENT_URI);
    // 第三个参数和第五个参数的关键字就不用写了
    Cursor c = resolver.query(uri, new String[] { "_id", "number", "date",
            "duration" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[]
            null, // where条件的参数"date=?,duration>?"
            null, // where条件参数?对应的具体的集合new String[]{"2012-01-01","1*60*1000"}
            "date desc" // 排序"date desc"
    );
    return c;
}
/**
 * 根据不同的类型获取电话记录 type:通话类型 (1、来电记录; 2、呼出记录; 3、未接电话)
 * 
 * @return
 */
public static Cursor getCallsType(ContentResolver resolver, int type) {
    Uri uri = Uri.parse("content://call_log/calls");
    // 第三个参数和第五个参数的关键字就不用写了
    Cursor c = resolver.query(uri, new String[] { "_id", "number", "date",
            "duration", "type" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[]
            "type = ?", // where条件的参数"type =?"
            new String[] { type + "" }, // where条件参数?对应的具体的集合new String[]{"2"}
            "date desc" // 排序"date desc"
    );
    return c;
}  

读取短信

class SMSHelper {
    /**
     * 查询所有短消息的信息
     *
     * @param resolver
     * @return
     */
    public static Cursor getAllMsgs(ContentResolver resolver) {
        Uri uri = Uri.parse("content://sms/");
        return resolver.query(uri, new String[] { "_id", "address", "body",
                "date" }, null, null, "date desc");
    }
    /**
     * 获取thread视图表的数据
     */
    public static Cursor getThreadMsgs(ContentResolver resolver) {
        // (* from threads --)
        Uri uri = Uri.parse("content://sms/");
        return resolver.query(uri, new String[] { "* from threads --" }, // 默认写 *就是所有列
                null, null, "date desc");
    }
    /**
     * 通过thread_id获取电话号码
     */
    public static String getAddressByThread_id(ContentResolver resolver,
            int thread_id) {
        String address = null;
        Uri uri = Uri.parse("content://sms/");
        Cursor c = resolver.query(uri, new String[] { "address" },
                "thread_id = ?", new String[] { thread_id + "" }, null);
        if (c.moveToNext()) {
            address = c.getString(c.getColumnIndex("address"));
        }
        return address;
    }
    /**
     * 查询没有读取短消息的信息
     * 
     * @param resolver
     * @return
     */
    public static Cursor getUnReadMsgs(ContentResolver resolver) {
        Uri uri = Uri.parse("content://sms/");
        return resolver.query(uri, new String[] { "_id", "address", "body",
                "date" }, "read = ?", new String[] { "0" }, "date desc");
    }
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值