Android通讯录结构
Android添加联系人到通讯录的方法

Android添加联系⼈到通讯录的⽅法⽬录字段联系⼈名字联系⼈昵称联系⼈头像联系⼈备注联系⼈号码联系⼈公司和职位⽹站联系⼈邮箱联系⼈地址添加⽅式1. 静默添加2. 跳转添加3. 添加到现有联系⼈权限字段联系⼈名字名字不知道为什么,值设置了之后传过去没有,于是⾃⼰通过 Intent 最后⼜单独传了⼀次// 联系⼈名字ContentValues row1 = new ContentValues();String name = lastName + middleName + firstName;row1.put(ContactsContract.Data.MIMETYPE, monDataKinds.StructuredName.CONTENT_ITEM_TYPE);row1.put(monDataKinds.StructuredName.DISPLAY_NAME, name);row1.put(monDataKinds.StructuredName.GIVEN_NAME,firstName);row1.put(monDataKinds.StructuredName.FAMILY_NAME,lastName);row1.put(monDataKinds.StructuredName.MIDDLE_NAME,middleName);联系⼈昵称ContentValues row2 = new ContentValues();row2.put(ContactsContract.Data.MIMETYPE, monDataKinds.Nickname.CONTENT_ITEM_TYPE);row2.put(, nickName);联系⼈头像这⾥需要将图⽚的 byte 数组传进去ContentValues row3 = new ContentValues();//添加头像row3.put(ContactsContract.Data.MIMETYPE, monDataKinds.Photo.CONTENT_ITEM_TYPE);Bitmap bitmap = BitmapFactory.decodeFile(photoFilePath);ByteArrayOutputStream baos = new ByteArrayOutputStream();press(pressFormat.JPEG, 100, baos);row3.put(monDataKinds.Photo.PHOTO, baos.toByteArray());联系⼈备注// 联系⼈备注ContentValues row4 = new ContentValues();row4.put(ContactsContract.Data.MIMETYPE, monDataKinds.Note.CONTENT_ITEM_TYPE);row4.put(monDataKinds.Note.NOTE, remark);联系⼈号码号码有很多种类型,电话,⼿机,传真,公司,家庭,等ContentValues row5 = new ContentValues();// 联系⼈的电话号码addPhoneNumber(row5, values, mobilePhoneNumber,monDataKinds.Phone.TYPE_MOBILE);ContentValues row6 = new ContentValues();// 联系⼈的公司电话addPhoneNumber(row6, values, hostNumber,monDataKinds.Phone.TYPE_COMPANY_MAIN);ContentValues row7 = new ContentValues();// 联系⼈的⼯作号码addPhoneNumber(row7, values, workPhoneNumber,monDataKinds.Phone.TYPE_WORK_MOBILE);ContentValues row8 = new ContentValues();// 联系⼈的⼯作传真addPhoneNumber(row8, values, workFaxNumber,monDataKinds.Phone.TYPE_FAX_WORK);ContentValues row9 = new ContentValues();// 联系⼈的住宅号码addPhoneNumber(row9, values, homePhoneNumber,monDataKinds.Phone.TYPE_HOME);ContentValues row10 = new ContentValues();// 联系⼈的住宅传真addPhoneNumber(row10, values, homeFaxNumber,monDataKinds.Phone.TYPE_FAX_HOME);//封装的添加⽅法private void addPhoneNumber(ContentValues row, ArrayList<ContentValues> values, String phoneNumber, int type) {row.put(ContactsContract.Data.MIMETYPE,monDataKinds.Phone.CONTENT_ITEM_TYPE);row.put(monDataKinds.Phone.NUMBER, phoneNumber);row.put(monDataKinds.Phone.TYPE, type);values.add(row);}联系⼈公司和职位// 联系⼈公司和职位ContentValues row11 = new ContentValues();row11.put(ContactsContract.Data.MIMETYPE, anization.CONTENT_ITEM_TYPE);row11.put(PANY, organization);row11.put(anization.TITLE, title);⽹站// 联系⼈⽹站ContentValues row12 = new ContentValues();row12.put(ContactsContract.Data.MIMETYPE, monDataKinds.Website.CONTENT_ITEM_TYPE);row12.put(monDataKinds.Website.URL, url);联系⼈邮箱// 插⼊Email数据ContentValues row13 = new ContentValues();row13.put(ContactsContract.Data.MIMETYPE, monDataKinds.Email.CONTENT_ITEM_TYPE);row13.put(monDataKinds.Email.DATA, email);row13.put(monDataKinds.Email.TYPE, monDataKinds.Email.TYPE_WORK);联系⼈地址地址分为家庭,⼯作和其他。
指导学习:Android通讯录之界面设计一

《Android基础应用》
指导学习:通讯录之界面设计一
⏹课程内容回顾
⏹AndroidUI之界面布局
⏹Android四大组件之Activity
⏹AndroidUI之常用控件
⏹难点突破
⏹AndroidUI之界面布局
⏹Android四大组件之Activity
⏹AndroidUI之常用控件
⏹作业讲评
1.需求说明
开发自己的通讯录。
功能有:
●添加通讯录信息
●浏览通讯录信息
●通讯录详细信息
本次项目内容
●实现浏览通讯录界面
●实现添加通讯录界面
●实现通讯录详细界面
●界面之间的切换与数据传递
2. 综合练习:我的通讯录
2.1 阶段1:练习——主界面浏览我的通讯录
需求说明:
使用LinearLayout 布局嵌套RelativeLayout 完成主界面的开发,如图所示
添加用户按钮切换到添加通讯录用户界面
2.2阶段2:练习——添加通讯录用户界面
需求说明:
使用ScrollView完成界面的设计,解决屏幕内容多显示不全问题
姓名手机办公电话
家庭电话职务单位名称
地址 Email 备注
保存后返回主界面,传递添加的用户数据,主界面提示显示添加的用户信息
2.3阶段3:练习——通讯录详细信息显示
需求说明:
点击主界面的头像,切换到详细信息界面,并且传递数据到详细界面显示
数据传递使用Map进行数据的传递,传递的数据只要求
头像id
返回按钮实现切换回主界面
修改按钮切换界面控件处于编辑状态。
Android手机通讯录的设计与分析

e vi r c e是 一种 可长 时 间运 行 的程序 , 但 移 动终 端 的 高速 发展 , 使得 人 们 对手 机 应 用 的 需 关组 件 交互 。S 求 更加 显 著 。根据 手 机 功 能使 用调 查 显 示 , 有 八 成 以 是它 却 没有 用户 界面 。
上 的消 费者 使用 手机 通 讯录 功能 频繁 。作为 手机 基本
讯录 显 得尤 为重 要 。虽 然 A n d r o i d自带 了具有 一 定功 应 的操 作 。可让 应用 程序 对外 部事 件做 出响应 。无法
能 的通 讯 录软 件 ,可 是存 在 着 拨 号 时没 有 号码 联 想 、 生成 U I , 故 而对 用 户 而 言不 是透 明 的 。通 过 N o t i i f c a —
缺 乏个 性 化设 置 等诸 多 不足 ,常 常让 用 户难 以适 应 。 t i o n Ma n a g e r , 能让 用户 知道 这些 事件 发 生 了。 A n d r o i d的 自由及 开源 ,为 手机 通 讯 录 系统 的开 发 设 计提 供 了简 单可 行 的策 略 。 管理 软件 。 以J a v a 语 言为基 础 , 结合 A n d r o i d移动 开发 平台, 利用 A n d r o i d提供 的 S D K , 实现 在 A n d r o i d平 台
本文 的 目标 即是 开发 基于 A n d r o i d的手 机 的通 讯 的第 三方 应用 数据 的访 问方案 。
上运 行 的手机 通讯 录 。 该手机 通讯 录面 向所 有 A n d r o i d 联 式数 据库 管 理 系统 ,它 的设计 目标 是嵌 入式 的 , 而 手机 用户 , 能够 提供 实 际便捷 的手机 服务 。除具有 增 、 且 目前 已经在 很 多嵌 入式 产 品中使 用 了它 , 它 占用 资 删、 改、 查 等通 讯 录基 本 功 能外 , 通 讯 录 的数 据 备 份与 源 非 常 的低 , 在 嵌 入式 设 备 中 , 可 能 只需 要 几 百 K 的 还原 功能是 该 系 统 的一大 特 色 , 另外 , 增加 的“ 个 人 空 内存 就够 了 。 间’ ’ 工 力能让用 户 可设立 私密 联系 人 , 访 问需要用 户 口令
Android手机通讯录(源码)

Android⼿机通讯录(源码) 简易⼿机通讯录⼀:功能模块 1.主界⾯,通过listview 展⽰所有联系⼈信息,并在没有联系⼈时给出友好提⽰ 2.主界⾯.显⽰最近查看的某个联系⼈信息 3.主界⾯,可以长按某联系⼈项,弹出菜单,删除该联系⼈;删除联系⼈后,在⼿机通知栏弹出信息给⽤户提⽰ 4.主界⾯选择分组,可以查看所有联系⼈,也可以只查看某⼀分组的联系⼈ 5.点击主界⾯的某联系⼈,可以进⼊联系⼈详情界⾯,查看联系⼈各详细信息,并可修改联系⼈各信息; 联系⼈的性别和所在分组可通过下拉菜单选择;长按电话号码,可以进⼊拨打电话功能; 修改联系⼈信息后,跳转回到主界⾯,并使⽤Toast给予⽤户提⽰ 6.主界⾯菜单栏可以添加新联系⼈,关于等功能 7.能在联系⼈详情界⾯,动态增加多个联系电话,并储存到数据库中效果图展⽰:源码下载地址:项⽬回顾: 1.scrollview嵌套listview产⽣的滑动冲突(recyclerview) 解决⽅案:listView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_UP){//点击listview⾥⾯滚动停⽌时,scrollview拦截listview的触屏事件,就是scrollview该滚动了scrollView.requestDisallowInterceptTouchEvent(false);}else{//当listview在滚动时,不拦截listview的滚动事件;就是listview可以滚动,scrollView.requestDisallowInterceptTouchEvent(true);}return false;}}); 2.关于listview 中 EditText 监听//1.在设置text前,先移除监听if (viewHodler.number.getTag() instanceof TextWatcher) {viewHodler.number.removeTextChangedListener((TextWatcher) viewHodler.number.getTag());}if (TextUtils.isEmpty(phoneNumber.getNumber())){viewHodler.number.setText("");}else {viewHodler.number.setText(phoneNumber.getNumber());}//2.新建监听类TextWatcher watcher = new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {if (TextUtils.isEmpty(s)) {phoneNumber.setNumber(null);finalViewHodler.imageView.setVisibility(View.GONE);} else {phoneNumber.setNumber(s.toString());finalViewHodler.imageView.setVisibility(View.VISIBLE);}Log.e("tag", "afterTextChanged: " +s.toString() );}};//3.添加监听器viewHodler.number.addTextChangedListener(watcher);viewHodler.number.setTag(watcher); 3.获取listview 中所有 Editext 的值 思路:在适配器中创建HashMap 在getview()⽅法中保存所有的Editext key = position value = editext 然后在通过HashMap 获取就⾏了private HashMap<Integer,EditText> edMap;@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {PhoneAdapter.ViewHodler viewHodler = null;if (convertView == null) {viewHodler = new PhoneAdapter.ViewHodler();convertView = LayoutInflater.from(context).inflate(yout.phone_list_item, null, false);viewHodler.spinner = convertView.findViewById(R.id.pnone_spinner);viewHodler.number = convertView.findViewById(R.id.pnone_number);viewHodler.imageView = convertView.findViewById(R.id.imageView4);//put 保存edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);convertView.setTag(viewHodler);} else {viewHodler = (PhoneAdapter.ViewHodler) convertView.getTag();edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);} 4.拨打电话功能的坑public void call(String telPhone){if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){//要在telPhone前加上字符串tel:Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + telPhone));startActivity(intent);}} 不让你就会见到下图:。
Android系统架构及内核简介

Android系统架构及内核简介(来源于ThinkPHP)Android是Google公司开发的基于Linux平台的开源⼿机操作系统,它包括操作系统、中间件、⽤户界⾯和应⽤程序,⽽且不存在任何以往阻碍移动产业创新的专利权障碍,并由Google公司于2007年11⽉5⽇正式发布。
同时,Google公司组建了⼀个开放⼿机联盟,这个联盟由中国移动、摩托罗拉、⾼通、宏达电和T-Mobile等在内的全球30多家技术和⽆线应⽤的领军企业组成,Google通过与运营商、设备制造商、开发商和其他有关各⽅结成深层次的合作伙伴关系,希望借助建⽴标准化、开放式的移动电话软件平台,在移动产业内形成⼀个开放式的⽣态系统;可预见地,⽣产和使⽤基于 Android系统的嵌⼊式⼿持移动设备将是未来的发展趋势,对相应软件的需求量也将⽇趋增长,因此对Android系统内部作⼀个完整和深⼊的分析,对基于Android平台的软件移植和开发是很有益处的。
1 Android系统平台架构对操作系统⽽⾔,必须做到设计合理、层次分明,同时还需考虑整个系统的结构要聚耦适当,Android系统是基于linux内核的,因此还必须具备开源的特性,以符合开源⼈员共同⼯作。
从系统的组成要件来讲,Android平台架构包括硬件设备、板级⽀持包、驱动程序、操作系统内核、程序运⾏库,运⾏框架,应⽤程序等,它们的有机结合和协同⼯作共同完成了整个系统的正常运⾏和对事务的处理。
依据Google开源资料可知,整个系统由Linux内核、程序库、Android Runtime、应⽤程序框架和应⽤程序等5部分组成,,系统架构如图1所⽰。
参照图1,由上⽽下对组成系统各部分的主要组件作以下描述。
1.1 Linux内核Android基于Linux 2.6内核,但并⾮完全照搬内核,⽽是对内核作了部分增删和修改,在Linux 2.6内核的基础上,Android核⼼系统实现了安全性、内存管理、进程管理、⽹络协议栈和驱动模型等功能,Linux内核也同时作为硬件和软件栈之间的抽象层。
通讯录排序规则

通讯录排序规则通常取决于不同的操作系统和通讯录应用程序。
一般来说,通讯录中的联系人可以通过姓名字母顺序、电话号码、邮箱地址等多种方式进行排序。
在
iOS系统中,通讯录默认按照姓和名的拼音首字母进行排序,也可以在设置中进行调整。
而在Android系统中,通讯录则默认按照联系人的名字进行排序,也可以通
过多种方式进行自定义排序。
此外,一些第三方通讯录应用程序也提供了多种排序方式,例如按照联系人的使用频率、生日、添加时间等进行排序。
总之,通讯录排序规则可以根据个人需要进行调整,以便更好地管理和查找联系人。
基于android企业内部通讯录设计与实现

基于android的企业内部通讯录的设计与实现背景和意义智能手机(smartphone)是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。
是一种安装了相应开放式操作系统的手机。
通常我们使用的智能手机操作系统有:symbian、ios、android、windows phone等。
而根据最近谷歌、苹果等公司陆续公布了2012年第四季度的财报,可以看到,目前的智能手机市场,基本是android和ios两大系统的天下,尤其是android系统,凭借免费的特点,成为了许多厂商制造手机的首选系统。
著名数据分析机构idc在2012年第三季度公布的数据表示,android系统已经占有了全球智能手机75%的市场。
而排在第二位的则是苹果的ios系统,占有了14。
9%的市场。
在这两大系统背后则是黑莓、windows phone以及塞班系统。
智能手机的普及极大的方便了人们的日常生活,越来越多的传统门户及应用软件加入了智能手机平台终端应用里头,常见的如美团、去哪儿、新浪微博等都针对智能手机进行了相应软件的开发。
通常单位的通讯录为了方便人查阅和随身携带,一般采用印制的方式,然后装订成册。
可以长期保存。
但是这种方式也存在一些问题,如印制错误照成资源浪费、联系人电话变更后无法及时更改等。
在信息技术高速发展的今天,采用电子通讯录的方式记录员工电话,既能降低办公成本,又能实时更新、提高通讯录的正确率。
基于android的内部通讯录,采用目前市场占有率最高的android手机为客户端,通过服务端统一的webservice接口查询员工信息,使院内员工可以方便快速的查询人员电话,并可采用快捷方式拨打电话、发送短信、导入本地通讯录。
同时服务器端维护人员,可以根据具体情况对人员手机号码等信息进行维护,并实时共享发布到平台上,使员工手机上的通讯录保持统一性。
Android开发之获得通讯录及SIM卡中联系人

Android开发之获得通讯录及SIM卡中联系人Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来。
这一篇文章我主要带领同学们熟悉Android的通讯录机制。
图中选中的数据库 contacts2.db就是系统储存联系人的数据库,我们将它打开看看里面储存了些什么东东?打开contacts.db后发面里面有一堆表,同学们先别慌张。
今天我们主要讨论红框内的4个比较常用的表,后期我在介绍其它表的使用。
这里说一下如果你想在真机上查看数据库的话必需要先获得root权限,否则无法查看。
1.contacts 表_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空times_contacted:通话记录的次数last_time_contacted: 最后的通话时间lookup :是一个持久化的储存因为用户可能会改名子但是它改不了lookup2.data表raw_contact_id:通过raw_contact_id可以找到 raw_contact表中相对的数据。
data1 到 data15 这里保存着联系人的信息联系人名称联系人电话号码电子邮件备注等等。
3.phone_look_up表data_id : 通过data_id可以找到 datat表中相对的数据。
raw_contact_id : 通过raw_contact_id 可以找到 raw_contact_表中相对的数据。
normalized_number: 这个字段就比较有意思了,它是将每个电话号码逆序排列。
4.raw_contact表version :版本号,用于监听变化deleted :删除标志, 0为默认 1 表示这行数据已经删除display_name : 联系人名称last_time_contacts : 最后联系的时间有关这些的源码都在android.provider.ContactsContract这个类里面,如果想深入了解的话可以去看看,数据库相关的操作联查啊啥的都在里面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这次主要要做的就是根据姓名来查找电话,并且加强对通讯录的理解。
以前做一些用到数据库的东西的时候,可能光看代码也是不好联系起各个数据之间的关系,所以我先想到的还是数据库。
幸运的是,它还真是一个数据库。
Android里面内置的是SQLite的数据库,虽然对数据库不怎么了解,但关系型数据库,基本操作也就那些,而且基本都一样,所以就直接用呗。
用命令行下的adb shell进入Android的模拟器,进入data/data目录下面,这里面就是安装的一些应用程序。
找啊找,里面有一个com.android.providers.contacts,怎么看都是一个通讯录相关的程序,进入这个目录下,里面有一个databases,就它了,再进去就可以看到有个c ontacts2.db的文件。
用sqlite3打开这个数据库文件。
查看里面的表。
里面表很多,不过看两遍后发现表的名字很熟悉,像什么data,raw_contacts,contacts,minetypes等,前面几个都是我们上次说的那几个所谓的数据模型,它们还真是数据库。
查询一下data表里面的所有信息,可以发现里面的信息联系起来就都是我们通讯录里面的名片。
虽然不是一条显示全部,但每个名字每个电话,每个E-mail都有,而且都是分开显示的。
现在对于这个应该就有点感觉了。
再看一下表的结构,用”.schema”命令后会看到,类似如下的信息:
.schema data
CREATE TABLE data (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
package_id INTEGER REFERENCES package(_id),
mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL,
raw_contact_idINTEGER REFERENCES raw_contacts(_id) NOT NULL, is_primary INTEGER NOT NULL DEFAULT 0,
is_super_primary INTEGER NOT NULL DEFAULT 0,
data_version INTEGER NOT NULL DEFAULT 0,
data1 TEXT,
data2 TEXT,
data3 TEXT,
data4 TEXT,
data5 TEXT,
data6 TEXT,
data7 TEXT,
data8 TEXT,
data9 TEXT,
data10 TEXT,
data11 TEXT,
data12 TEXT,
data13 TEXT,
data14 TEXT,
data15 TEXT,
data_sync1 TEXT,
data_sync2 TEXT,
data_sync3 TEXT,
data_sync4 TEXT );
下面还有点索引和触发器的信息就不看了,结合查询的数据看一下。
其中“_id”就是表的一个自增id字段。
第二个package_id暂时没用到,数据里面全是空。
第三个字段minetype_id 应该就是MIMETYPE了(其实还是有点不一样的)。
后的raw_contact_id就是名片的ID。
再看后的data1,data2等字段,每条数据中的这几项都不大相同,准确的说,minetype_id字段不同的数据data1,data2 等字段的数据就不同。
现在应该就有一个概念了,以前说的MIMETYPE的值确定Data.DATA1等的值的类型的意思就是在data数据库中通过mimetype_id的值就可以确定data1,data2等字段的真正意义。
也就是说在data数据库中通过minetype_id的值可以确定那一条数据到底是存储的姓名,还是电话,还是E-mail或者其它。
这样一来,如果我们要查询某个特定的数据的时候就可以直接查询data表里面的data1,data2这类字段的值,而唯一的必要条件就是在where条件语句里面将minetype_id赋为对应的值。
这样就有了一个统一的数据访问方法。
而且可以通过这个表查到所以想要的数据。
所以如果想要通过姓名查找一个人的电话就可以这样了,先通过设置MIMETYPE 为
monDataKinds.StructuredName.DISPLAY_NAME ,查找姓名所对应的RAW_CONTACT_ID 。
再将MIMETYPE 设置为
monDataKinds.Phone.CONTENT_ITEM_TYPE,查找上面找到的RAW_CONTACT_ID 所对应的电话就可以了。
按这个细路就可以写代码了:
view source
print?
01。