package com.ittianyu.mobileguard.engine;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import com.ittianyu.mobileguard.domain.ContactBean;
import java.util.ArrayList;
import java.util.List;
/**
* read contacts engine
* Need request permissions if the SDK >= 23
*/
public class ContactsEngine {
private static final String AUTHORITIES_CONTACTS = "com.android.contacts";
private static final String AUTHORITIES_CALL_LOG = "call_log";
private static final String AUTHORITIES_SMS = "sms";
private static final String CONTENT = "content://";
/**
* read the contact list.
* @param context
* @return a List<ContactBean>. The result can't be null. So you just need check contacts.size()
*/
public static List<ContactBean> readContacts(Context context) {
List<ContactBean> contacts = new ArrayList<>();
// get resolver
ContentResolver resolver = context.getContentResolver();
// query contact id
Uri contactsUri = Uri.parse(CONTENT + AUTHORITIES_CONTACTS + "/raw_contacts");
Cursor contactsCursor = resolver.query(contactsUri, new String[]{"contact_id"}, null, null, null);
if (null == contactsCursor)
return contacts;
while (contactsCursor.moveToNext()) {
// get value
int contactId = contactsCursor.getInt(0);
// new bean
ContactBean contact = new ContactBean();
contact.setId(contactId);
// add to list
contacts.add(contact);
}
contactsCursor.close();
// query data: phone email and name
for (ContactBean contact : contacts) {
Uri dataUri = Uri.parse(CONTENT + AUTHORITIES_CONTACTS + "/data");
Cursor dataCursor = resolver.query(dataUri, new String[]{"mimetype", "data1"},
"raw_contact_id=?", new String[]{contact.getId() + ""}, null);
while (dataCursor.moveToNext()) {
// get value
String mimetype = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
String data1 = dataCursor.getString(dataCursor.getColumnIndex("data1"));
// System.out.println(mimetype);
// System.out.println(data1);
// set value
if("vnd.android.cursor.item/email_v2".equals(mimetype)) {
contact.setEmail(data1);
} else if("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
contact.setPhone(data1);
} else if("vnd.android.cursor.item/name".equals(mimetype)) {
contact.setName(data1);
}
}
dataCursor.close();
}
return contacts;
}
/**
* read call log contacts
* @param context
* @return
*/
public static List<ContactBean> readCallLogContacts(Context context) {
List<ContactBean> contacts = new ArrayList<ContactBean>();
// get resolver
ContentResolver resolver = context.getContentResolver();
// query contact id
Uri contactsUri = Uri.parse(CONTENT + AUTHORITIES_CALL_LOG + "/calls");
Cursor cursor = resolver.query(contactsUri, new String[]{"_id", "number", "name"}, null, null, "date desc");
if (null == cursor)
return contacts;
while (cursor.moveToNext()) {
// get value
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String number = cursor.getString(cursor.getColumnIndex("number"));
String name = cursor.getString(cursor.getColumnIndex("name"));
// new bean
ContactBean contact = new ContactBean(id, number, null, name);
// add
contacts.add(contact);
}
cursor.close();
return contacts;
}
/**
* read sms log contacts
* @param context
* @return
*/
public static List<ContactBean> readSmsContacts(Context context) {
List<ContactBean> contacts = new ArrayList<ContactBean>();
// get resolver
ContentResolver resolver = context.getContentResolver();
// query contact id
Uri contactsUri = Uri.parse(CONTENT + AUTHORITIES_SMS);
Cursor cursor = resolver.query(contactsUri, new String[]{"_id", "address", "person"}, null, null, "date desc");
if (null == cursor)
return contacts;
while (cursor.moveToNext()) {
// get value
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String number = cursor.getString(cursor.getColumnIndex("address"));
String name = cursor.getString(cursor.getColumnIndex("person"));
// new bean
ContactBean contact = new ContactBean(id, number, null, name);
// add
contacts.add(contact);
}
cursor.close();
return contacts;
}
}