要获取手机中的联系人,微软提供了Icontact接口,可以实现,获取Sim卡联系人,可以通过SimReadPhonebookEntry函数来实现,在SDk中均提供了例子。不过还可以通过读数据库的方法来读取联系人
记得以前在网上看到过有人测试过用Icontact接口来读联系人和用读数据库的方法来获取联系人的效率,好像读数据库可以快很多。
手机联系人存储在pim.vol卷上,数据库名为:Contacts Database,不知道从什么时候开时,Sim卡联系人也存储在了这个数据库里面,所以要获取所有联系人的话,只读这一个数据库就可以了,而且可以提高一下读取时的速度,好像尤其读Sim卡的时候是比较慢的。
打开数据库后,先获取里面联系人的条数,然后申请空间,再一条一条的往外读。
下面是代码:
- int GetContactByEDB()
- {
- CEGUID guid = {0};
- CREATE_INVALIDGUID(&guid);
- if (!CeMountDBVolEx(&guid, _T("pim.vol"), NULL, OPEN_EXISTING | EDB_MOUNT_FLAG))
- {
- return -1;
- }
- CEOID oid = 0;
- HANDLE hDatabase = CeOpenDatabaseInSession(NULL, &guid, &oid,
- _T("Contacts Database"), NULL,
- CEDB_AUTOINCREMENT, NULL);
- if (hDatabase == INVALID_HANDLE_VALUE)
- {
- CeUnmountDBVol(&guid);
- return -1;
- }
- //取得联系人的数目
- BY_HANDLE_DB_INFORMATION bhdi = {0};
- bhdi.wVersion = 2;
- bhdi.guidVol = guid;
- bhdi.oidDbase = oid;
- if (!CeGetDBInformationByHandle(hDatabase, &bhdi))
- {
- return -1;
- }
- DWORD dwContactNumber = bhdi.infDatabase.dwNumRecords;
- *ppuInfo = new PhoneUserInfo[dwContactNumber];
- if (*ppuInfo == NULL)
- {
- return -1;
- }
- //开始读取
- WORD wNumProps = 0;
- CEPROPVAL *pRecord = NULL;
- DWORD dwBufSize = 0;
- CEOID oidRecord = 0;
- DWORD dwPos = 0;
- CeSeekDatabaseEx(hDatabase, CEDB_SEEK_BEGINNING, 0, 0, 0);
- while (oidRecord = CeReadRecordPropsEx(hDatabase, CEDB_ALLOWREALLOC, &wNumProps, NULL, (LPBYTE *)&pRecord, &dwBufSize, NULL))
- {
- for (int i = 0; i < wNumProps; i++)
- {
- switch(pRecord[i].propid)
- {
- case PIMPR_FIRST_NAME:
- break;
- case PIMPR_LAST_NAME:
- break;
- case PIMPR_MOBILE_TELEPHONE_NUMBER: //移动电话(SIM卡读出来的字段也是这个)
- break;
- }
- }
- dwPos++;
- }
- CloseHandle(hDatabase);
- CeUnmountDBVol(&guid);
- return dwPos;
- }
有人说用CeGetDBInformationByHandle获取数据库记录不成功,我测试的时候正常,能正确的获取记录条数。