联系人是手机功能中不可缺少的模块,主要记录用户的联系人数据,方便用户快捷的操作和使用,主要包括本机联系人和Sim卡联系人。
本机联系人主要存储在手机内部存储空间,Android平台上是通过数据库(Provider)进行存储,并提供复杂的字段用于表示联系人数据,并提供用户快捷的操作,比如增加,删除,修改,查询等等。
Sim卡联系人主要存储在Sim卡内部存储文件,包括adn、fdn、sdn。主要提供简单的字段用于表示联系人数据。并通过IccProvider提供的接口进行数据的增加、删除、修改、查询操作。
Contacts主要提供联系人列表显示、增删改、查找、显示选项、导入导出,数据同步和SNS整合、分享联系人、桌面快捷方式和文件夹、快捷操作、其他应用获取数据。
导入导出主要有导出到SD卡,从SD卡导入,从SIM导入。SD卡导入导出主要是通过vCard的形式,存储到sd卡或者从sd卡读取指定的vCard文件并进行解析。Sim导入主要是通过IccProvider的query方法将Sim卡联系人读取出来,用户可以选择全部导入或者导入指定的Sim卡联系人。目前不支持导出到Sim卡。恢复与备份模块可以通过ContentResolver获取手机和Sim卡联系人信息通过vCard的形式将其存入到SD卡中。
Sim卡联系人整合:实时获得Sim卡的状态,对Sim上的联系人导入到本地数据库,或者将本地数据中Sim卡联系人删除。数据库Contacts表和raw_Contacts表表
中有字段indicate_phone_or_sim_contact表示是否为Sim卡联系人,并区分出Sim1,Sim2上的联系人。
首先通过ContentResolver查询手机及Sim卡indicate_phone_or_sim_contact列来获取是否存在联系人,如果存在标志位,再通过查找手机及Sim'卡的ID进行判断具体的信息。手机的ID为-1,但是Sim卡的ID并不是1或者2,而是随运营商和Sim卡槽不同而不同,发现如果有两张中国移动卡,Sim卡的ID为2和4,如果是联通则为6,因此需要通过相关的函数动态获取Sim卡ID。
List<SubscriptionInfo> mSimInfoList;
mSimInfoList = SubscriptionManager.from(this).getActiveSubscriptionInfoList();
这个函数用来获取Sim卡的信息列表
cursor.getInt(0) == mSimInfoList.get(0).getSubscriptionId()
通过查询get(0).getSubscriptionId(),获取第一个卡槽的Sim卡是否存在联系人。
ContentResolver resolver = getContentResolver();
Cursor cursor = null;
boolean hasOne = false;
boolean hasTwo = false;
boolean hasThree = false;
try {
cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, new String[] {Contacts.INDICATE_PHONE_SIM}, null, null, null};
if(cursor != null) {
while (cursor.moveToNext()) {
if (cursor.getInt(0) == -1) {
hasOne = true;
}
if (cursor.getInt(0) == mSimInfoList.get(0).getSubscriptionId()) {
hasTwo = true;
}
if (cursor.getInt(0) == mSimInfoList.get(1).getSubscriptionId()) {
hasThree = true
}
}
} catch (Exception e) {
} finally {
if (cursor != null ) {
cursor.close();
}
}
通过hasPhoneContacts,hasSimContactsFirst,hasSimContactsSecond是否为真来分别判断手机,Sim1,Sim2是否存在联系人,根据是否存在联系人,将存在联系人的手机或者Sim卡String传值给setMultiChoiceItems(select, temp, new DialogInterface. OnMultiChoiceClickListener(){})中的select的string数组,首先得确定select[]数组大小,
simCount为有联系人的Sim卡个数,
contactCount为有联系人的手机和Sim卡个数,
mSimCount为总的Sim卡个数