import java.io.InputStream;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
public class CopyOfContactCollector {
private static final String TAG = CopyOfContactCollector.class.getSimpleName();
private static final String KEY_BIRTH = "birthday";
private static final String KEY_ADDR = "address";
private static final String KEY_NICKNAME = "nickname";
private static final String KEY_ORG = "org";
private static final String KEY_IM = "IM";
private static final String KEY_NOTE = "note";
private static final String KEY_EMAIL = "email";
private static final String KEY_PHONE = "phone";
private static final String KEY_WEBSITE = "website";
private static final String KEY_PHOTO = "photo";
private Context context;
public CopyOfContactCollector(Context context) {
this.context = context;
}
public void getContacts() {
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
null);
JSONArray contactList = new JSONArray();
while (cursor.moveToNext()) {
String contactId = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
int hasPhone = cursor.getInt(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String contactName = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
long photoId = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
JSONObject item = new JSONObject();
item.put("id", contactId);
item.put("name", contactName);
// phone
if (hasPhone == 1) {
this.getPhone(contactId, item);
}
// photo
this.getPhoto(contactId, photoId, item);
// email
this.getEmail(contactId, item);
// address
this.getAddress(contactId, item);
// birthdat
this.getBirthday(contactId, item);
// instant message
this.getIM(contactId, item);
// nickname
this.getNickname(contactId, item);
// note
this.getNote(contactId, item);
// org
this.getOrg(contactId, item);
// website
this.getWebsite(contactId, item);
contactList.put(item);
}
JSONObject data = new JSONObject();
data.put("CONTACTS", contactList);
data.put("TIMESTAMP", System.currentTimeMillis());
System.out.println(data.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
private void getPhone (String contactId, JSONObject data) throws JSONException {
Cursor pCur = null;
try {
pCur = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{contactId + ""},
null);
JSONArray phoneList = new JSONArray();
while (pCur.moveToNext()) {
int type = pCur.getInt(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE));
String phoneType = ContactsContract.CommonDataKinds.Phone.getTypeLabel(
context.getResources(), type, "").toString();
String phoneNumber = pCur.getString(pCur.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
JSONObject item = new JSONObject();
item.put("phone", phoneNumber);
item.put("type", phoneType);
phoneList.put(item);
}
data.put(KEY_PHONE, phoneList);
} finally {
if (pCur != null) {
pCur.close();
}
}
}
private void getEmail (String contactId, JSONObject data) throws JSONException {
Cursor emailCur = null;
try {
emailCur = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{contactId},
null);
JSONArray emailList = new JSONArray();
while (emailCur.moveToNext()) {
String email = emailCur.getString(emailCur.getColumnIndex(
ContactsContract.CommonDataKinds.Email.DATA));
int type = emailCur.getInt(emailCur.getColumnIndex(
ContactsContract.CommonDataKinds.Email.TYPE));
String emailType = ContactsContract.CommonDataKinds.Email.getTypeLabel(
context.getResources(), type, "").toString();
JSONObject item = new JSONObject();
item.put("email", email);
item.put("type", emailType);
emailList.put(item);
}
data.put(KEY_EMAIL, emailList);
} finally {
if (emailCur != null) {
emailCur.close();
}
}
}
private void getNote (String contactId, JSONObject data) throws JSONException {
Cursor noteCur = null;
try {
String noteWhere =
ContactsContract.Data.CONTACT_ID + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
String[] noteWhereParams = new String[]{
contactId,
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
noteCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
noteWhere,
noteWhereParams,
null);
if (noteCur.moveToFirst()) {
String note = noteCur.getString(noteCur.getColumnIndex(
ContactsContract.CommonDataKinds.Note.NOTE));
data.put(KEY_NOTE, note);
}
} finally {
if (noteCur != null) {
noteCur.close();
}
}
}
private void getWebsite (String contactId, JSONObject data) throws JSONException {
Cursor websiteCur = null;
try {
String where =
ContactsContract.Data.CONTACT_ID + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParams = new String[]{
contactId,
ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE};
websiteCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
where,
whereParams,
null);
if (websiteCur.moveToFirst()) {
String website = websiteCur.getString(websiteCur.getColumnIndex(
ContactsContract.CommonDataKinds.Website.URL));
data.put(KEY_WEBSITE, website);
}
} finally {
if (websiteCur != null) {
websiteCur.close();
}
}
}
private void getIM (String contactId, JSONObject data) throws JSONException {
Cursor imCur = null;
try {
String imWhere =
ContactsContract.Data.CONTACT_ID + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
String[] imWhereParams = new String[]{contactId,
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
imCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
imWhere,
imWhereParams,
null);
JSONArray imList = new JSONArray();
while (imCur.moveToNext()) {
String imName = imCur.getString(
imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
int type = imCur.getInt(
imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
String imType = ContactsContract.CommonDataKinds.Im.getTypeLabel(
context.getResources(), type, "").toString();
JSONObject item = new JSONObject();
item.put("imName", imName);
item.put("imType", imType);
imList.put(item);
}
data.put(KEY_IM, imList);
} finally {
if (imCur != null) {
imCur.close();
}
}
}
private void getOrg (String contactId, JSONObject data) throws JSONException {
Cursor orgCur = null;
try {
String orgWhere =
ContactsContract.Data.CONTACT_ID + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
String[] orgWhereParams = new String[]{contactId,
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
orgCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
orgWhere,
orgWhereParams,
null);
JSONArray orgList = new JSONArray();
while (orgCur.moveToNext()) {
String orgName = orgCur.getString(orgCur.getColumnIndex(
ContactsContract.CommonDataKinds.Organization.DATA));
String title = orgCur.getString(orgCur.getColumnIndex(
ContactsContract.CommonDataKinds.Organization.TITLE));
JSONObject item = new JSONObject();
item.put("orgName", orgName);
item.put("title", title);
orgList.put(item);
}
data.put(KEY_ORG, orgList);
} finally {
if (orgCur != null) {
orgCur.close();
}
}
}
private void getNickname (String contactId, JSONObject data) throws JSONException {
Cursor nicknameCur = null;
try {
String nicknameWhere =
ContactsContract.Data.CONTACT_ID + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
String[] nicknameWhereParams = new String[]{contactId,
ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE};
nicknameCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
nicknameWhere,
nicknameWhereParams,
null);
while (nicknameCur.moveToNext()) {
String nickname = nicknameCur.getString(nicknameCur.getColumnIndex(
ContactsContract.CommonDataKinds.Nickname.NAME));
data.put(KEY_NICKNAME, nickname);
break;
}
} finally {
if (nicknameCur != null) {
nicknameCur.close();
}
}
}
private void getBirthday (String contactId, JSONObject data) throws JSONException {
Cursor bCur = null;
try {
bCur = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] {ContactsContract.CommonDataKinds.Event.DATA },
ContactsContract.Data.CONTACT_ID+" = "+contactId+" AND "
+ContactsContract.Data.MIMETYPE+" = '"
+ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE+"' AND "
+ContactsContract.CommonDataKinds.Event.TYPE+" = "
+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY,
null,
null);
while (bCur.moveToNext()) {
String birthday = bCur.getString(0);
data.put(KEY_BIRTH, birthday);
break;
}
} finally {
if (bCur != null) {
bCur.close();
}
}
}
/**
* Get address infomation of given contact.
*
* @param contactId
* @param data
* @throws JSONException
*/
private void getAddress (String contactId, JSONObject data) throws JSONException {
Cursor postals = null;
try {
// address
postals = context.getContentResolver().query(
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = " + contactId,
null,
null);
int postFormattedNdx = postals.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
int postTypeNdx = postals.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
int postStreetNdx = postals.getColumnIndex(
ContactsContract.CommonDataKinds.StructuredPostal.STREET);
JSONArray addrList = new JSONArray();
while (postals.moveToNext()) {
String addressType = ContactsContract.CommonDataKinds.StructuredPostal
.getTypeLabel(context.getResources(), postTypeNdx, "").toString();
String str1 = postals.getString(postFormattedNdx);
String str2 = postals.getString(postStreetNdx);
JSONObject item = new JSONObject();
item.put("addressType", addressType);
item.put("address", str1 + str2);
addrList.put(item);
}
data.put(KEY_ADDR, addrList);
} finally {
if (postals != null) {
postals.close();
}
}
}
/**
* Get the photo of given contact.
*
* @param cr
* @param id
* @param photo_id
* @return
*/
private void getPhoto (String contactId, long photoId, JSONObject data) throws JSONException {
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(
context.getContentResolver(), uri);
if (input != null) {
/*Bitmap photo = BitmapFactory.decodeStream(input);
data.put(KEY_PHOTO, photo);*/
} else {
Log.d(TAG, "First try failed to load photo!");
}
byte[] photoBytes = null;
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photoId);
Cursor c = context.getContentResolver().query(
photoUri,
new String[] {ContactsContract.CommonDataKinds.Photo.PHOTO},
null,
null,
null);
try {
if (c.moveToFirst()) {
photoBytes = c.getBlob(0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
c.close();
}
if (photoBytes != null) {
/*Bitmap photo = BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);
data.put(KEY_PHOTO, photo);*/
} else {
Log.d(TAG, "Second try also failed!");
}
}
}
结果如下:
{
"TIMESTAMP": 946692989880,
"CONTACTS": [
{
"id": "801",
"phone": [
{
"type": "手机",
"phone": "11122"
},
{
"type": "家",
"phone": "222111"
}
],
"org": [],
"IM": [],
"address": [],
"email": [
{
"type": "工作",
"email": "zhangsan@qq.com"
}
],
"name": "john"
},
{
"id": "802",
"org": [],
"IM": [],
"address": [],
"email": [],
"name": "jack"
},
{
"id": "803",
"phone": [
{
"type": "手机",
"phone": "1300070302533"
}
],
"org": [],
"IM": [],
"address": [],
"email": [],
"name": "alex"
},
{
"id": "1064",
"birthday": "2000-01-06",
"phone": [
{
"type": "手机",
"phone": "18811112222"
},
{
"type": "家",
"phone": "18811113333"
},
{
"type": "工作",
"phone": "18811114444"
}
],
"IM": [
{
"imName": "12345678",
"imType": "其他"
},
{
"imName": "13245678",
"imType": "其他"
}
],
"website": "www.baidu.com",
"nickname": "nickname",
"address": [
{
"address": "百度市谷歌西路10086号",
"addressType": "自定义"
}
],
"email": [
{
"type": "工作",
"email": "office@xxx.com"
},
{
"type": "住宅",
"email": "home@xxx.com"
}
],
"name": "小强",
"org": [
{
"orgName": "三月",
"title": "攻城狮"
}
],
"note": "comment for test"
}
]
}