How to add contacts from phonebook
如何从电话本添加联系人

Note:API is deprecated in S60 3.2 so while using this API do consider this
在S60 3.2中不建议使用

There are plenty of occasions when you need to add contacts from Phonebook to your Symbian C++ application.
Examples are SMS, Call Control applications etc.
To do that you have to first load the phonebook's resource file like

有很多时候你需要从电话本中添加联系人,比如:短信、电话控制程序等。
要做这些,你必须先载入电话本资源:

RPbkViewResourceFile phonebookResource( *(CEikonEnv::Static()) );
phonebookResource.OpenL();

In general you would want to allow users to fetch multiple entries from the phonebook dialog
so you can use CPbkMultipleEntryFetchDlg and pass the correct parameters.
 Also attach the correct Phonebook Contact Engine to the dialog.
(Here I am picking the default contact book,
whereas you may want to display your own special contact book database.) The code may look like

一般来说,你想允许用户能从电话本对话框得到多个入口,所以你可以使用CPbkMultipleEntryFetchDlg ,然后传入正确的参数。
同时将正确的电话本联系人添加到对话框(在这里我使用默认的联系人本,你可能项显示你自己特定的联系人数据库)代码如下:

CPbkMultipleEntryFetchDlg::TParams params;
CleanupStack::PushL(params);
 
CPbkContactEngine* iPbkContactEngine =
   CPbkContactEngine::NewL(&iEikonEnv->FsSession());
CleanupStack::PushL(iPbkContactEngine);
params.iContactView = &iPbkContactEngine->AllContactsView();
 
CPbkMultipleEntryFetchDlg* fetcher =
   CPbkMultipleEntryFetchDlg::NewL(params, *iPbkContactEngine);
fetcher->SetMopParent(this);

Later just execute the dialog. On return, the dialog will give you a list of contact ids with
which you can access individually selected contacts from Contact Engine and process them
接下来只要执行对话框,返回时,对话框将给你一个联系人ID列表,这样你能够单独从联系人引擎单独选择和执行他们

TBuf<30> phoneNumber;
 
TInt paramCount = params.iMarkedEntries->Count();
// Get the selected contacts id array // 得到选择的联系人ID数组
for ( TInt i = 0; i < paramCount; ++i )
{
 const TContactItemId cid = ( *params.iMarkedEntries )[i];

// Open the selected contact using Phonebook engine,
 // choose correct number (launch list query if needed)
 // 使用电话本引擎打开选择的联系人,选择的正确的号码(如果需要启动列表询问框)
 CPbkContactItem* pbkItem = iPbkContactEngine->ReadContactLC( cid );
 TPbkContactItemField* tmp;
 if ((tmp = pbkItem->FindField(EPbkFieldIdPhoneNumberMobile)) != NULL)
 {
  phoneNumber = tmp->Text();
  if(phoneNumber.Length() > 0){
   if(iData)
                       iAppView->AddNumber(phoneNumber);
  }
 }
 
        CleanupStack::PopAndDestroy(1);//CPbkContactItem
}

If you want to implement the behavior that, if a contact item has more than one number,
and you want to show native dialog to choose between the numbers(like in native Sms application),
you can use following code
如果你项实现这样的行为:如果一个联系人项有多个号码,你想在本程序显示给用户来选择这些号码(如一个短信程序),
你可以使用以下代码:

TBuf<30> phoneNumber;
 
TInt paramCount = params.iMarkedEntries->Count();
// Get the selected contacts id array
for ( TInt i = 0; i < paramCount; ++i )
{
 TBuf<128> phoneNumber;
 TBuf<128> phoneName;
 TBool namefound = EFalse;
 const TContactItemId cid = ( *params.iMarkedEntries )[i];
 // Open the selected contact using Phonebook engine,
 // choose correct number (launch list query if needed)
 CPbkContactItem* pbkItem = iPbkContactEngine->ReadContactLC( cid );

//Using CPbkSmsAddressSelect dialog for user to choose between numbers
 // 使用CPbkSmsAddressSelect 对话框给用户选择号码
 CPbkSmsAddressSelect* dlg = new (ELeave) CPbkSmsAddressSelect();
 CPbkSmsAddressSelect::TParams addparams(*pbkItem);
 TBool selected = dlg->ExecuteLD(addparams);

//If selected is ETrue, it means that user has selected some number, else user has pressed cancel
 //Also, if contact item has only one number, then there is no popup shown to the user and returned value is ETrue

// 如果selected是ETrue,表明用户选择了某个号码,否则用户取消了选择。同样如果联系人项只有一个号码,就没有弹出菜单给用户,返回值仍然为ETrue

if(selected){
                //Getting the selected field, i.e. Mobile, Mobile (Business),Tel, Tel. (Home)
                //You can find the exact label of field by numtmp->Label()

//得到选择的字段,如移动、移动(办公)、电话、家庭电话,通过numtmp->Label()你能找到额外的字段标签
  const TPbkContactItemField* numtmp = addparams.SelectedField();
  if(numtmp){
   phoneNumber = numtmp->Text();
  }
  TPbkContactItemField* nametmp;
  if ((nametmp = pbkItem->FindField(EPbkFieldIdFirstName)) != NULL)
  {
   phoneName = nametmp->Text();
   if(phoneName.Length() > 0){
    namefound = ETrue;
   }
  }
  if ((nametmp = pbkItem->FindField(EPbkFieldIdLastName)) != NULL)
  {
   if(namefound){
           phoneName.Append(_L(" "));
    phoneName.Append(nametmp->Text());
   }
   else{
     phoneName = nametmp->Text();
   }
  } 
 }
        CleanupStack::PopAndDestroy(1);//CPbkContactItem
}

In the end clean up your stack and close phonebook resource
最后清理你的栈,关闭电话本资源

//CPbkContactEngine, CPbkMultipleEntryFetchDlg::TParams
CleanupStack::PopAndDestroy(2);
phonebookResource.Close();
=======================================================================================================
Headers required
#include <rpbkviewresourcefile.h>
#include <cpbkmultipleentryfetchdlg.h>
#include <cpbkcontactengine.h>
#include <cpbkcontactitem.h>
#include <cpbksmsaddressselect.h>

Library needed
LIBRARY   pbkview.lib pbkeng.lib

Capability required
Capability  ReadDeviceData ReadUserData WriteDeviceData WriteUserData

如何从电话本添加联系人相关推荐

  1. Android发送短信(短信发送以及群发和从电话本选择联系人)---短信管家2

    分析下怎么写 首先,我们需要一个输入框,可以手动的输入手机号码, 其次,很少有人愿意手动输入,那么我们需要提供一个按钮来给我们的用户选择自己电话本中的联系人(一次可以选择多个即群发) 然后,我们需要一 ...

  2. Android中读取电话本Contacts联系人的所有电话号信息

    1.首先,要知道android 的contacts里的电话信息有多类:moblie,家庭,工作,传真等.如图: 2.android的Contacts是通过ContentProvider来提供的,其实a ...

  3. android 手机号码去重,微信电话本和qq通讯录有什么不同?微信电话本常见问题汇总...

    微信电话本可谓是QQ通讯录的全新升级产品,重新整合进微信团队后,不仅仅UI界面更加类似微信,且功能上可将联系人对应的微信头像导入通讯录中,还可以识别陌生号码,支持来电号码归属地显示等等.对很多从QQ通 ...

  4. Python电话本系统(添加、修改、删除、查询)

    Phone Book电话本 phone_book = {} while True:print("欢迎使用电话本管理程序,请选择你要执行的功能:")print("1.添加联 ...

  5. android电话本备份至iphone,苹果手机怎么备份通讯录联系人到电脑?电话本备份与恢复教程...

    苹果手机怎么备份通讯录联系人到电脑?电话本备份与恢复教程.手机的通讯录号码没了,我们首先要想的就是在删除之前有没有备份过手机的通讯录号码数据,若没有备份,我们需要想办法将删除的数据恢复才对,因为手机通 ...

  6. MTK电话本联系人备份加密与破解

    过去公司的一个同事的一台用于商务活动的手机坏了,机型为MTK6253,里面储存了所有的电话号码,不幸之万幸在于T卡有一份电话本备份.但这个备份疑似使用了加密,电话本信息中用户姓名显示为字母和数字之组合 ...

  7. python程序实例电话本-利用Python电话本小程序!这波操作你给几分?

    原标题:利用Python电话本小程序!这波操作你给几分? 最近比较忙,只能抽空的写写文章,其实我也是一个上班族,python完全是个人想学然后希望以后对工作有所帮助,2019年了,祝大家新年快乐. 2 ...

  8. python程序实例电话本-Python示例

    本例是Python基础示例.涉及Python基础,包括语法.字典型数据结构.类.引入库.pickle实现的存储器.异常处理等. 示例是一个电话本.可以对电话本进行增加.删除.修改.获取列表和获取单人的 ...

  9. C#中教你一步步实现一个电话本窗体程序

    场景 使用C#窗体程序实现一个电话本应用程序. 实现 新建窗体程序,PhoneBook 然后打开工具箱,拖拽一个ListView到窗体中 拖拽完成后点击右上角三角符号,编辑选项--编辑列. 点击添加, ...

最新文章

  1. 零基础是学java还是python-零基础学习编程,Java、Python你会选择哪个?
  2. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  3. android 一个很漂亮的控件ObservableScrollView(含片段代码和源码)
  4. docker容器之RabbitMQ
  5. Java 项目 接口开发规范
  6. RT-Thread中自定义 FinSH 命令
  7. Mysql约束 笔记
  8. webclient对reactor-netty的封装
  9. matlab仿真弹簧波,基于Matlab/Simulink的三弹簧谐振子微振动的仿真实验
  10. TextBox的OnTextboxChanged事件里对Text重新赋值带中文, 导致崩溃
  11. php字库,TCPDF生成内置字库的PDF
  12. RHCE(八)ansible基础配置学习
  13. 【参赛作品71】CentOS 7.9 安装 openGauss 2.1.0 之剥茧抽丝
  14. 大话设计模式 第二十三章 命令模式 考羊肉串
  15. 拓展交流空间,分享开发精彩 | 开发者说·DTalk 鉴赏
  16. jupyter 启动后能打开页面 ,页面提示‘连接失败以及 TensorBoard的打开方法
  17. Python之父:Python 4.0可能不会有了
  18. Understanding Maximum-a-Posteriori (MAP) Estimation
  19. Linux模板机及集群相关操作
  20. efm8系列单片机c语言编程,EFM8单片机用Keil编程,头文件怎么写?

热门文章

  1. Excel单元格使用xlwings包调用python函数的公式,截取子网页(标题)的试验 问题求助CSDN
  2. Linux ping 命令介绍
  3. 5 数据库缓存机制 redis集群 --SoringBoot整合redis--及redis命令集
  4. matlab中ASR怎么搭建,ASR1802环境搭建
  5. 在DataGrid中帮定CheckBox和RidaoBox
  6. CSS基本(选择器及样式)--2021-08-12
  7. iOS5.0.1完美越狱教程【转】
  8. 前端|3D立体视频翻转动画
  9. Qt excel VBA findNext及find使用
  10. Android 开发凉了吗!