对于android还是新手,所以网上找了很多资源,总结起来如下;
1、通讯录存在sqlite里,可以通过类Cursor获取,这个就是一个表,表里面有通讯录里面的名字==
2、通讯录可能存在一个或多个相同名字不同号码,要注意
3、通讯录里面的ID对应Name,Name对应多个或Num
上代码:
public void getPhoneNumMsg(final Context context, final PhoneMsgCallback phoneMsgCallback){
JSONObject jsonData = new JSONObject();
int count = 0;
/*
* 获取手机通讯录数据
*参数含义:
第一个参数:是一个URI,指向需要查询的表;
第二个参数:需要查询的列名,是一个数组,可以返回多个列;
第三个参数:需要查询的行,where表示需要满足的查询条件,where语句里面可以有?号;
第四个参数:是一个数组,用来替代上面where语句里面的问号;
第五个参数:表示排序方式;
*/
Cursor cursor = context.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
null);
/*
* 判断数据是不是空的,要是空的直接回调,不是空的继续找
*/
if(cursor!=null){
/*
* 光标开始移动
*/
while(cursor.moveToNext()){
String name =
cursor.getString(
cursor.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME
//获取当前光标上的名字
));
String phoneId =
cursor.getString(
cursor.getColumnIndex(
ContactsContract.Contacts._ID
));
//获取当前光标上的ID(可根据这个ID找号码,因为号码可能是多个的)
String hasNum =
cursor.getString(
cursor.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER
));
//判断是否有号码存在
String number = "";
if(("1").equals(hasNum)){
/*
* 数据查询,在表里找对应的ID,将对应的全部取出
*/
Cursor phones =
context.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + phoneId,
null,
null);
if(phones.moveToFirst()){
do {
number =
phones.getString(
phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER
));
//在对应的ID数据上找号码,一个名字对应多个号码,对应一个ID
count++;
try {
jsonData.put(name, number);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} while (phones.moveToNext());
//这里一定要这么写,千万别觉得我获取号码就行了,这样会丢了数据
continue;
}
}
count++;
try {
jsonData.put(name, number);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//我自己写的回调,不用管
phoneMsgCallback.callback(count, jsonData);
}