需求很明确,获取手机和sim的联系人信息。接口设计也很简介
public interface OnFetchContactsListener {
void onFetcherContactsComplete(List list);
}
数据设计为:
public class ContactInfo extends BaseModel {
private static final long serialVersionUID = -8650648832668794807L;
/**联系人名**/
private String mName;
/**联系人电话号码**/
private String mPhoneNumber;
/**联系人ID**/
private String mId;
/**联系人名字字母**/
private String mNameLetter;
private int mOperatorType; //运营商判断,可有可无
}
细分一下,这里要解决3个问题:
如何获取手机联系人信息
如何获取sim卡的联系人信息
取出来的手机信息需要预处理一下变成统一个11位格式。
问题1:如何获取手机联系人信息
根据ContactsContract.Contacts.CONTENT_URI查询ContentResolver里面的数据,逐个取值即可。
问题2:如何获取sim卡的联系人信息
根据目前查找的信息来看,sim联系人的uri有两种:
问题3:预处理手机号
这个比较多变,常见的存储格式有:
"13515681234"
"135-1568-1234"
"135 1568 1234"
"+86 135 1568 1234"
考虑到只使用国内市场,所以最后可以统一为"13515681234"
完整demo如下
包含两个文件:ContactsFetcherHelper和ContactInfo
public class ContactInfo extends BaseModel {
private static final long serialVersionUID = -8650648832668794807L;
/**联系人名**/
private String mName;
/**联系人电话号码**/
private String mPhoneNumber;
/**联系人ID**/
private String mId;
/**联系人名字字母**/
private String mNameLetter;
private int mOperatorType; //运营商判断,可有可无
public void setLetter(String letter) {
mNameLetter = letter;
}
public String getLetter() {
return mNameLetter;
}
public void setName(String name) {
mName = name;
}
public String getName() {
return mName == null? "" : mName;
}
public void setPhoneNumber(String number) {
mPhoneNumber = number;
if (isMobileNumber(number) || isUnicomNumber(number)) {
setmOperatorType(0);
} else {
setmOperatorType(1);
}
}
public String getPhoneNumber() {
return mPhoneNumber;
}
public void setId(String id) {
mId = id;
}
public String getId() {
return mId;