Android 22Contacts表结构
安卓系统文件夹详细结构及其文件解析
安卓系统文件夹详细结构及其文件解析安卓系统的文件夹结构是一个非常复杂的层次结构,涵盖了各种各样的文件和文件夹,用于管理设备的各种功能和资源。
下面是对安卓系统文件夹结构的详细解析。
1.根目录:- /system:系统级文件夹,包含了系统的核心组件和应用程序。
其中最重要的文件是/ system / bin / 和/ system / xbin / 中的二进制可执行文件。
- /data:包含了应用程序和用户数据的文件夹。
每个应用程序都会被分配一个唯一的文件夹,其中包含了该应用程序的所有数据。
- /cache:用于存储临时文件和缓存文件。
- /mnt:用于挂载外部存储设备和其他文件系统。
2. /system目录:- /system/bin:包含了系统级的可执行文件,例如adb、mount等。
- /system/etc:包含了一些系统配置文件,例如hosts文件用于域名解析。
- /system/framework:包含了系统框架的核心文件,例如Android 的API类库和资源文件。
- /system/lib:包含了系统级的共享库,例如图形渲染库、音频库等。
- /system/media:包含了系统的多媒体资源文件,例如系统的铃声、壁纸等。
- /system/usr:包含了一些系统级的用户应用程序。
3. /data目录:- /data/app:包含了已安装的应用程序的APK文件。
- /data/data:包含了应用程序的数据文件,包括数据库、偏好设置等。
- /data/cache:包含了应用程序的缓存文件。
- /data/misc:包含了一些杂项的系统数据,例如wifi配置文件。
- /data/system:包含了系统级的数据,例如安全证书、用户配置等。
4. /cache目录:- /cache/dalvik-cache:包含了Dalvik虚拟机的缓存文件,用于提高应用程序的启动速度。
- /cache/recovery:包含了刷机时使用的恢复模式的相关文件。
ContactProvider介绍
以下均是使用模拟器对Android 2.2系统联系人进行的分析。
系统联系人数据库存放在如下位置(data\data\com.android.providers.contacts\data bases\):数据库名为contacts2.db图 1使用SQLite Expert Professional打开该数据库,存在以下表:图 2其中有比较重要的三个表:data、raw_contacts、contacts。
一、三个重要的表1、data表data表中存放的是联系人具体信息,每行存储一位联系人的某个信息(如电话,姓名,邮箱等),结构如下:图 3data表建表语句如下:CREATE TABLE data (_id INTEGER PRIMARY KEY AUTOINCREMENT, 主键,每行IDpackage_id INTEGER REFERENCES package(_id),mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL, 引用表mimetypes,代表该行数据类型(The kind of data stored in a given row is specified by the row's MIMETYPE value, which determines the meaning of the generic columns DATA1 through DATA15)raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL, 引用表raw_contacts,代表该数据所对应的联系人IDis_primary INTEGER NOT NULL DEFAULT 0,is_super_primary INTEGER NOT NULL DEFAULT 0,data_version INTEGER NOT NULL DEFAULT 0,data1 TEXT, 该行数据的主要信息,如电话号码,姓名等(DATA1 is an indexed column and should be used for the data element that is expected to be most frequently used in query selections.)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, data1-data15每项含义与mimetype_id有关data_sync1 TEXT,data_sync2 TEXT,data_sync3 TEXT,data_sync4 TEXT );data表触发器如下:CREATE TRIGGER data_updated AFTER UPDATE ON data BEGIN UPDATE data SET data_version=OLD.data_version+1 WHERE _id=OLD._id; UPDATE raw_contacts SET version=version+1 WHERE_id=OLD.raw_contact_id; END;CREATE TRIGGER data_deleted BEFORE DELETE ON data BEGIN UPDATE raw_contacts SET version=version+1 WHERE _id=OLD.raw_contact_id; DELETE FROM phone_lookup WHERE data_id=OLD._id; DELETE FROM status_updates WHERE status_update_data_id=OLD._id; DELETE FROM name_lookup WHERE data_id=OLD._id; END;目前模拟器中联系人如下:图 4图 6图 8数据库data表的数据如下:其中raw_contact_id值为3、5、6、8的行被标注,其对应的联系人为模拟器中的4个联系人:A(电话:1)、B(电话:2)、C(电话:3)、D-name2 D-name1(电话:123、456,住宅邮箱:email-home,住宅地址:Street City,Province postcode,组织:Whu,Stu),见图4―图8。
android获取通讯录信息
开发中需要获取手机用户的通讯录信息,要求运行在Andrid2.0及以上版本,因为程序中用到了Android2.0新的API。
程序运行结果通过Log.v写入到了日志,结果部分截图:程序的主要代码如下:protected void getContactInfo() {//获得通讯录信息,URI是ContactsContract.Contacts.CONTENT_URICursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {//获得通讯录中每个联系人的IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//获得通讯录中联系人的名字String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAM E));Log.v(TAG, "…name…" + name);//查看给联系人是否有电话,返回结果是String类型,1表示有,0表是没有String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) );if (hasPhone.equalsIgnoreCase("1"))hasPhone = "true";elsehasPhone = "false";//如果有电话,根据联系人的ID查找到联系人的电话,电话可以是多个if (Boolean.parseBoolean(hasPhone)) {Cursor phones = getContentResolver().query(monDataKinds.Phone.CONTENT_URI,null,monDataKinds.Phone.CONTACT_ID+ " = " + contactId, null, null);while (phones.moveToNext()) {String phoneNumber = phones.getString(phones.getColumnIndex(monDataKinds.Phone.N UMBER));Log.v(TAG, "…phoneNumber…" + phoneNumber);}phones.close();}//查找email地址,这里email也可以有多个Cursor emails = getContentResolver().query(monDataKinds.Email.CONTENT_URI,null,monDataKinds.Email.CONTACT_ID + " = "+ contactId, null, null);while (emails.moveToNext()) {String emailAddress = emails.getString(emails.getColumnIndex(monDataKinds.Email.DATA ));Log.v(TAG, "…emailAddress…" + emailAddress);}emails.close();//获得联系人的地址Cursor address = getContentResolver().query(monDataKinds.StructuredPostal.CONTENT_ URI,null,monDataKinds.StructuredPostal.CONTACT_ID+ " = " + contactId, null, null);while (address.moveToNext()) {// These are all private class variables, don’t forget to cre ate// them.String poBox = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.POBOX));String street = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.STREET));String city = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.CITY));String state = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.REGION));String postalCode = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.POSTCODE));String country = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.COUNTRY));String type = address.getString(address.getColumnIndex(monDataKinds.StructuredP ostal.TYPE));Log.v(TAG, "…city…" + city);}}cursor.close();}代码中已经有了注释,这里不做过多解释,比较重要的方法getContentResolver().query在文章Android简单操作sqlite中有解释。
Android联系人【Contacts】模块学习总结
String name = sharedPreferences.getString("name", "");//第二个参数为缺省值 int age = sharedPreferences.getInt("age", 1);
Context.MODE_WORLD_READABLE);//注意此处的 mode String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 1);
3. 嵌入式关系型数据库 SQLite
Context.MODE_PRIVATE); outStream.write(buffer); outStream.close(); … } }
数据文件位于/data/data/<package name>/files 的应用私有目录下。如果希望文件被其他 应用操作,可以传入:
openFileOutput("android.txt", Context.MODE_WORLD_WRITEABLE);
更新语句:update 表名 set 字段名=值 where 条件子句。如:
update person set name=’Android’ where id=10
删除语句:delete from 表名 where 条件子句。如: delete from person where id=10
通信中的拉姆架构
通信中的拉姆架构
Android电话部分主要分为:Modem驱动、RIL(Radio Interface Layer)、电话服务框架、应用4层结构。
通讯框架的应用层主要包括通话界面IncallUi,处理通话逻辑的TeleService和Telecomm,网络设置ConnectivitySettings等。
TeleService和Telecomm通过Binder传递数据。
Framework层是通信框架的核心部分,也是本书介绍的重点。
包括通话,数据网络,短彩信收发,主副卡切换等业务逻辑。
这在之后的章节中会为大家一一介绍。
rild是Init进程启动的一个本地服务,这里需要注意的是,从Google8.0之后,这个本地服务的通讯方式从socket改为了HIDL。
HIDL是用于指定HAL与其用户之间接口的一个接口描述语言(Interface Description Language),它允许将指定的类型与函数调用收集到接口(Interface)和包(Package)中。
更广泛地说,HIDL 是一个可以让那些独立编译的代码库(Libraries)之间进行通信的系统。
Google在考虑了互用,效率,直观这几各方面才决定将通讯方式改为HIDL。
Android2.2手机中文详细说明书
用户使用手册欢迎:欢迎您选择使用本手机,您可以通过阅读本手册,全面的了解此款手机的使用,领略其完善的功能和简介的操作方法。
声明:本手册仅作为产品使用指导,并不代表对产品软硬件配置的说明,产品和配件可能因地区而异。
本手机为双卡双待手机,适用于WCDMA以及GSM/GPRS网络环境,某些功能需要网络运营商或服务提供商的支持,详细请参见用户手册相关内容。
为保证您的安全使用,请先阅读“安全须知”。
III手册图标说明:【 】 表示一个按键操作。
黑体字 表示一个界面菜单或图标操作。
表示提示信息。
表示产品使用之特别说明或提示。
表示特别需要注意的警示信息。
目录1.认识您的手机 (1)∙按键说明 (3)∙开始使用设备 (4)∙安装USIM/SIM卡和电池 (4)∙安装存储卡 (10)∙为电池充电 (11)∙开机和关机 (12)∙密码 (12)PIN码 (12)PIN2码 (12)PUK与PUK2码 (12)2.快速入门指南 (13)∙开启和关闭屏幕 (13)∙锁定与解锁 (13)∙主屏幕 (14)∙状态栏图标 (15)∙应用程序菜单 (17)∙设置时间和日期 (18)∙拨打电话 (18)从拨号盘拨打电话 (18)从联系人拨打电话 (19)从通话记录拨打电话 (19)从收藏中拨打电话 (19)创建一个收藏联系人 (19)III∙接听来电,查看未接来电 (20)接听来电 (20)查看未接来电 (20)∙信息 (20)3.文本输入和智能手机设置 (22)∙文本输入 (22)∙智能手机设置 (23)声音设置 (23)显示设置 (24)安全设置 (25)主屏幕设置 (25)4.互联网 (27)∙浏览器 (27)浏览网页 (27)浏览器设置 (28)∙蓝牙连接 (28)开启/关闭蓝牙 (28)蓝牙设置 (29)将手机连接到新设备 (30)∙W I-F I (30)连接Wi-Fi (30)Wi-Fi搜索和连接 (31)5.联系人 (32)查看联系人 (32)创建联系人 (33)编辑联系人 (34)删除联系人 (34)导入导出联系人 (34)6.信息与邮件 (35)IV∙信息 (35)创建短信息 (35)回复信息 (35)创建彩信 (36)管理信息 (36)∙邮件 (37)设置电子邮件 (37)发送邮件 (38)接收邮件 (38)7.多媒体 (40)∙照相机 (40)拍摄照片 (40)查看照片 (41)∙音乐播放器 (41)播放音乐 (42)∙录音机 (44)8.其他应用程序 (45)∙时钟 (45)添加闹钟 (45)∙日历 (45)添加新活动 (46)管理日程安排 (46)∙计算器 (46)∙地图 (47)9.电池维护与设备保养 (48)∙电池维护 (48)∙设备保养 (49)10.简单故障排除 (50)V移动电话机环保说明 (52)VI安全须知请阅读下列简易的使用规则。
Android系统精简列表对照表
安卓系统精简列表对照表,适用于大部分Android系统,大家请参考对照精简。
AirkanPhoneService 可删AntiSpam 可删AdupsFot.apk无线升级(可删)AdupsFotaReboot.apk重启升级操作(可删)ApplicationGuide.apk-应用程度指南(不可删)ApplicationsProvider.apk-应用程序存储服务(不可删)AtciService.apk--系统服务(不可删)Backup.apk 可删BackupRestoreConfirmation.apkGoogle邮箱的备份,可删BasicDreams.apk 4.2新增,休眠模式,不可删BatteryWarning.apk--电池警告(建议保留)Browser.apk-谷歌浏览器(可删)BugReport 可删Calculator.apk---计算器(可删)Calendar.apk日历(可删,换第三方日历)CalendarImporter.apk日历服务(同上)CalendarProvider.apk-日历存储(同上)CDS_INFO.apk--常见数据服务(不可删)CellBroadcastReceiver.apk小区广播(可删)CellConnService.apk---电话连接服务(不可删)CertInstaller.apk-证书安装,可删(亲测,没发现问题)Cit可删CloudService可删ChromeBookmarksSyncAdapter.apk-Google书签同步(可删)com.google.android.apps.docs.apk--云端硬盘(可删)com.google.android.apps.maps.apk-谷歌地图(可删)com.google.android.googlequicksearchbox.apk-Google搜索(可删)com.google.android.street.apk--街景视图(可删)Contacts.apk--通讯录/联系人(不可删)ContactsProvider.apk--通讯录/联系人数据存储服务(不可删)DataHubProvider.apk. 会导致流量红圈不可删DataTransfer.apk-备份与恢复(可删)DataUsageLockScreenClient.apk数据应用和锁定屏幕客户端(不可删)DefaultContainerService.apk-默认存储服务(不可删)DeskClock.apk闹钟,时钟(建议保留)DownloadProvider.apk 下载管理器,可删(删了就不能在谷歌电子市场和谷歌浏览器下载东西了,需要的留着)DownloadProviderUi.apk 下载内容,可删(同上)DrmProvider.apk 受DRM保护的内容的存储,可删(有DRM保护的东西就留着这个)Email.apk-电子邮件(可删)EngineerMode.apk--工程模式(不可删)EngineerModeSim.apksim卡工程模式(不可删)EventReceiver 翻译过来就是事件接收还是别删了这个网上没查到多少资料Exchange2.apk--消息协作服务(可删)Facelock---人脸解锁(可删)FactoryMode.apk工厂模式(不可删)FileManager.apk-文件管理(觉得无用可删)FM 可删FMRadio.apk-收音机(建议保留)FusedLocation.apk-GPS定位辅助文件(不可删)无限重启)Galaxy4.apk--动态壁纸黑洞(可删)Gallery2.apk--图库/相机(建议保留)GenieWidget.apk新闻和天气(可删)Gmail.apk--谷歌邮箱(可删)Gmail2.apk谷歌邮箱(可删)GmsCore.apkGoogleplay服务(可删)GoogleBackupTransport.apk--谷歌备份传输(可删)GoogleCalendarSyncAdapter.apk谷歌日历同步(可删)GoogleContactsSyncAdapter.apk谷歌联系人同步(可删)GoogleEars.apk--GooglePlay声音搜索(可删)GoogleFeedback.apk---谷歌电子市场反馈(可删)GoogleLoginService.apkGoogle账户管理(可删)GoogleOta.apk---谷歌系统升级(可删)GoogleOtaSysOper.apk---谷歌系级升级辅助操作(跟上面是一起的,可删)GoolePartnerSetup.apkGoole合作伙伴设置(可删)GoogleServicesFramework.apk-谷歌同步支持服务架构(可删)GoogleTTSGoogle文字转语音引擎(可删)HoloSpiralWallpaper.apk--壁纸(可删)HTMLViewer.apk查看本地网页(建议保留)HoloSpiralWallpaper 可删InputDevices.apk OTG功能需要的别删KeyChain.apk输入服务(不可删)密码管理--帐号切换、密码存储,建议保留LatinIME.apk-Android键盘(可删)Launcher2.apk---启动器(不可删,可替换)LiveWallpapers.apkAndroid动态壁纸(可删)LBESEC_MIUI.apk 这个是授权管理LBE安全大师MIUI系统专版的安装包可能会影响自带的root功能先不删LiveWallpapersPicker.apk-动态壁纸选择器(不要动态壁纸可删)LocationEM.apk工程师模式(不可删)Matcli 应该是自己装的第三方软件自动装进了系统app文件里吧网上也没详细说明还是别删了怕系统不稳定MagicSmokeWallpapers.apk魔幻动态壁纸(可删)mainkeys.apk虚拟按键开启/关闭(建议保留)MediaProvider.apk--媒体数据存储服务(不可删,删后无法设置铃声)MediaTekLocationProvider.apk-联发科定位存储(可删)MediaUploader.apk---上传的内容(建议保留)MiuiCompass.apk MIUI 指南针可删(可替代)MiuiGallery.apk MIUI 图库勿删MiuiHome.apk MIUI 启动器删之前必须在系统设置——全部设置——显示——默认桌面——自己选择好第三方桌面才行MiuiSystemUI.apk MIUI 系统用户界面勿删MiuiVideo 可删MiuiVideoPlayer 可删MiWallpaper 可删Mms.apk短信和彩信(可用第三方短信软件来代替) MTKAndroidSuiteDaemon.apk-联发科安卓套件精灵(可删)MtkBt.apk-MTK蓝牙(不可删)MTKLogger.apk--MTK移动日志记录器(可删)MTKThermalManager.apk联发科温度检测和管理(建议保留)MtkVideoLiveWallpaper.apk-MTK动态壁纸(可删)MtkWeatherProvider--天气服务(可删)MtkWeatherWidget.apk天气插件(不用系统天气软件的可删)MtkWorldClockWidget.apk-世界时钟插件(可删)Music.apk---音乐播放器(可删,可用第三方程序代替)MusicFX.apk-音乐播放器的音效均衡器(可删)mx86.apk-虚拟按键开启/关闭设置net.cactii.flash2.apk---手电筒(建议保留)Networkassistant.apk 自带流量监控可删NetworkLocation.apk提供网络位置(GPS辅助定位,不能删)NFC.apk 近距离无线通讯技术重要的新鲜的功能别删NoiseField.apk--泡沫动态壁纸(可删)NoteBook.apk---记事本(可删)Notes 小米便签可删nvcplsvc.apk 省电功能别删NvwfdProtocolsPack网上说是跟连接小米盒子有关系可删但还是别删吧网上搜索结果资料很少说明不详细怕不稳定NvwfdService同上还是别删吧Omacp.apk--手机内部配置信息(不可删)OneTimelnitializer.apk谷歌一次性备份恢复(可删)OOBE.apk设置向导(可删)PackageInstaller.apk---APK软件安装器(不可删)PhaseBeam.apk-动态壁纸光之韵律(可删)PhaseBeam.apk-动态壁纸雷光(可删)Phone.apk电话连接服务(不可删)Phonesky.apk谷歌电子商店(可删)PhotoT able.apk 互动屏保,可删(我删了,我不用那屏保)PicoTts.apk文字转语音服务(可删)Protips.apk桌面小绿人插件(可删)Provision.apk系统初始开机引导(不可删)QuickSearchBox.apk---快速搜素(可删)Ringdroid.apk铃声剪辑(可删)SchedulePiowerOnOff.apk定时开关机(建议保留)Settings.apk--系统设置(不可删)SettingsProvider.apk---设置储存(不可删)SetupWizard.apk设置向导(可删)SharedStorageBackup.apk 共享存储备份可删作用不大删了很多游戏就不能玩了SmartcardService.apk 智能卡服务作用大概和电脑的CPU一样,很重要还是别删sougoushurufa.apk--搜狗拼音输入法(可删,安装其它的)SoundRecorder.apk---录音机(建议保留)Stk1.apk卡1的stk开机提示服务(可删)Stk2.apk卡2的STK开机提示服务(可删)StkSelection.apk-SIM卡服务,就是移动和联通的服务(可删)SuperUser.apk---超级用户权限(建议保留)SystemUpdate.apk-安卓4.2.1系统文件(建议保留)tag.apk 据说是NFC近距离无线通信服务和ncf.apk有关的ncf删了的话tag也没用,就可以删了的和nfc一样还是别删了Talk.apk---谷歌语音信息服务(可删)Talkback.apk--系统设置-辅助功能里面的盲人补丁(可删)TaskManager2.apk-任务管理器(可删)TelephonyProvider.apk拨号记录存储服务(不可删)ThemeManager.apk MIUI 主题风格建议保留可删Todos.apk待办事项(可删)Torch.apk-手电筒(建议保留,也可换成别的手电筒)Transfer 快传软件可删Updater.apk MIUI 系统更新可删(影响在线升级)UpdateSystem.apk系统升级(可删)Userbook 用户手册可删UserbookProvider 用户手册存储可删UserDictionaryProvider.apk用户字典存储服务(可删)VideoEditor.apk电影工作室(可删)VideoFavorites.apk最爱联系人(可删)VideoPlayer.apk-视频播放器/视频壁纸选择器(可删)VisualizationWallpapers.apk---音乐可视化壁纸(可删)VoiceAssist 语音助手可删就是类似哦啦语音那种的VioceCommand.apk--声音指命/语音指挥官(可删)VoiceSearchStub.apk-语音搜索存根(可删)VoiceUnilck.apk语音解锁(可删)VpnDialogs.apk--拨号,公司内部登陆和翻墙用的(建议保留)WallpaperChooser.apk---壁纸(可删)XiaomiServiceFramework 可删小米服务框架kYGPS.apkGPS(不可删)YellowPage 不可删未存号码拨打删了就不能打还未保存的号码,只可以打名片夹里有名字的号码。
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这个类里面,如果想深入了解的话可以去看看,数据库相关的操作联查啊啥的都在里面。
android联系人数据库介绍
<联系人>联系人数据库介绍拟制: Prepared by 吕欣阳日期:Date2015-11-26审核: Reviewed by 日期:Dateyyyy-mm-dd审核: Reviewed by 日期:Dateyyyy-mm-dd批准: Granted by日期:Dateyyyy-mm-dd青岛海信移动技术股份有限公司版权所有侵权必究修订记录Revision record目录联系人数据库介绍 (1)1 关键类 (1)1.1 ContactAggregator.java (1)1.2 MoreDatabaseUtils.java (1)1.3 ContactsDumpActivity.java (1)1.4 CallLogProvider.java (2)1.5 ContactLocaleUtils.java (2)1.6 ContactsDatabaseHelper.java (3)1.7 ContactsProvider2.java (4)1.8 DataRowHandler.java (5)1.9 FastScrollingIndexCache.java (5)1.10 GlobalSearchSupport.java (6)1.11 HanziToPinyin.java (6)1.12 NameSplitter.java (6)1.13 PhotoProcessor.java (6)1.14 SearchIndexManager.java (6)2 数据库主要表介绍 (7)2.1 Accounts表 (7)2.2 Contacts表 (7)2.3 data表 (7)2.4 groups表 (8)2.5 mimetypes表 (8)2.6 name_lookup表 (8)2.7 phone_lookup表 (8)2.8 raw_contacts表 (9)2.9 search_index_content表 (9)3 phone_lookup查询介绍 (10)4 私密联系人实现 (10)5 sqlite3介绍 (11)联系人数据库介绍1 关键类1.1 ContactAggregator.java合并、拆分类,两个联系人可以合并为一个,合并后详情显示全部信息,编辑界面可以看到合并的多个记录;合并后记录可以拆分为合并之前的多个记录对于contacts表的操作也在这个类中,contacts表中数据的生成在computeAggregateData()函数中。
Android 2.2Contacts表结构
long _ID read-only Row ID
String MIMETYPE read/write-once StructuredName.CONTENT_ITEM_TYPE ;Phone.CONTENT_ITEM_TYPE;Email.CONTENT_ITEM_TYPE ;Organization.CONTENT_ITEM_TYPE;Im.CONTENT_ITEM_TYPE ;Nickname.CONTENT_ITEM_TYPE ;Note.CONTENT_ITEM_TYPE;StructuredPostal.CONTENT_ITEM_TYPE;GroupMembership.CONTENT_ITEM_TYPE ;Website.CONTENT_ITEM_TYPE;Event.CONTENT_ITEM_TYPE ;Relation.CONTENT_ITEM_TYPE;
int IS_SUPER_PRIMARY read/write Whether this is the primary entry of its kind for the aggregate contact it belongs to. Any data record that is "super primary" must also be "primary". For example, the super-primary entry may be interpreted as the default contact value of its kind (for example, the default phone number to use for the contact).
long PNOTO_ID read-only ContactsContract.Data table holding the photo. That row has the mime type CONTENT_ITEM_TYPE.
最全的Android源码目录结构详解
最全的Android源码目录结构详解收藏转自/a/android/2010/0622/67.htmlAndroid 2.1|-- Makefile|-- bionic (bionic C库)|-- bootable (启动引导相关代码)|-- build (存放系统编译规则及generic等基础开发包配置)|-- cts (Android兼容性测试套件标准)|-- dalvik (dalvik JAVA虚拟机)|-- development (应用程序开发相关)|-- external (android使用的一些开源的模组)|-- frameworks (核心框架——java及C++语言)|-- hardware (部分厂家开源的硬解适配层HAL代码)|-- out (编译完成后的代码输出与此目录)|-- packages (应用程序包)|-- prebuilt (x86和arm架构下预编译的一些资源)|-- sdk (sdk及模拟器)|-- system (底层文件系统库、应用及组件——C语言)`-- vendor (厂商定制代码)bionic 目录|-- libc (C库)| |-- arch-arm (ARM架构,包含系统调用汇编实现)| |-- arch-x86 (x86架构,包含系统调用汇编实现)| |-- bionic (由C实现的功能,架构无关)| |-- docs (文档)| |-- include (头文件)| |-- inet (?inet相关,具体作用不明)| |-- kernel (Linux内核中的一些头文件)| |-- netbsd (?nesbsd系统相关,具体作用不明)| |-- private (?一些私有的头文件)| |-- stdio (stdio实现)| |-- stdlib (stdlib实现)| |-- string (string函数实现)| |-- tools (几个工具)| |-- tzcode (时区相关代码)| |-- unistd (unistd实现)| `-- zoneinfo (时区信息)|-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,)| |-- alpha (apaha架构)| |-- amd64 (amd64架构)| |-- arm (arm架构)| |-- bsdsrc (?bsd的源码)| |-- i386 (i386架构)| |-- i387 (i387架构?)| |-- ia64 (ia64架构)| |-- include (头文件)| |-- man (数学函数,后缀名为.3,一些为freeBSD的库文件)| |-- powerpc (powerpc架构)| |-- sparc64 (sparc64架构)| `-- src (源代码)|-- libstdc++ (libstdc++ C++实现库)| |-- include (头文件)| `-- src (源码)|-- libthread_db (多线程程序的调试器库)| `-- include (头文件)`-- linker (动态链接器)`-- arch (支持arm和x86两种架构)bootable 目录.|-- bootloader (适合各种bootloader的通用代码)| `-- legacy (估计不能直接使用,可以参考)| |-- arch_armv6 (V6架构,几个简单的汇编文件)| |-- arch_msm7k (高通7k处理器架构的几个基本驱动)| |-- include (通用头文件和高通7k架构头文件)| |-- libboot (启动库,都写得很简单)| |-- libc (一些常用的c函数)| |-- nandwrite (nandwirte函数实现)| `-- usbloader (usbloader实现)|-- diskinstaller (android镜像打包器,x86可生产iso)`-- recovery (系统恢复相关)|-- edify (升级脚本使用的edify脚本语言)|-- etc (init.rc恢复脚本)|-- minui (一个简单的UI)|-- minzip (一个简单的压缩工具)|-- mtdutils (mtd工具)|-- res (资源)| `-- images (一些图片)|-- tools (工具)| `-- ota (OTA Over The Air Updates升级工具)`-- updater (升级器)build目录.|-- core (核心编译规则)|-- history (历史记录)|-- libs| `-- host (主机端库,有android “cp”功能替换)|-- target (目标机编译对象)| |-- board (开发平台)| | |-- emulator (模拟器)| | |-- generic (通用)| | |-- idea6410 (自己添加的)| | `-- sim (最简单)| `-- product (开发平台对应的编译规则)| `-- security (密钥相关)`-- tools (编译中主机使用的工具及脚本)|-- acp (Android "acp" Command)|-- apicheck (api检查工具)|-- applypatch (补丁工具)|-- apriori (预链接工具)|-- atree (tree工具)|-- bin2asm (bin转换为asm工具)|-- check_prereq (检查编译时间戳工具)|-- dexpreopt (模拟器相关工具,具体功能不明)|-- droiddoc (?作用不明,java语言,网上有人说和JDK5有关)|-- fs_config (This program takes a list of files and directories)|-- fs_get_stats (获取文件系统状态)|-- iself (判断是否ELF格式)|-- isprelinked (判断是否prelinked)|-- kcm (按键相关)|-- lsd (List symbol dependencies)|-- releasetools (生成镜像的工具及脚本)|-- rgb2565 (rgb转换为565)|-- signapk (apk签名工具)|-- soslim (strip工具)`-- zipalign (zip archive alignment tool)dalvik目录dalvik虚拟机.|-- dalvikvm (main.c的目录)|-- dexdump (dex反汇编)|-- dexlist (List all methods in all concrete classes in a DEX file.)|-- dexopt (预验证与优化)|-- docs (文档)|-- dvz (和zygote相关的一个命令)|-- dx (dx工具,将多个java转换为dex)|-- hit (?java语言写成)|-- libcore (核心库)|-- libcore-disabled (?禁用的库)|-- libdex (dex的库)|-- libnativehelper (Support functions for Android's class libraries)|-- tests (测试代码)|-- tools (工具)`-- vm (虚拟机实现)development 目录(开发者需要的一些例程及工具)|-- apps (一些核心应用程序)| |-- BluetoothDebug (蓝牙调试程序)| |-- CustomLocale (自定义区域设置)| |-- Development (开发)| |-- Fallback (和语言相关的一个程序)| |-- FontLab (字库)| |-- GestureBuilder (手势动作)| |-- NinePatchLab (?)| |-- OBJViewer (OBJ查看器)| |-- SdkSetup (SDK安装器)| |-- SpareParts (高级设置)| |-- Term (远程登录)| `-- launchperf (?)|-- build (编译脚本模板)|-- cmds (有个monkey工具)|-- data (配置数据)|-- docs (文档)|-- host (主机端USB驱动等)|-- ide (集成开发环境)|-- ndk (本地开发套件——c语言开发套件)|-- pdk (Plug Development Kit)|-- samples (例程)| |-- AliasActivity (?)| |-- ApiDemos (API演示程序)| |-- BluetoothChat (蓝牙聊天)| |-- BrowserPlugin (浏览器插件)| |-- BusinessCard (商业卡)| |-- Compass (指南针)| |-- ContactManager (联系人管理器)| |-- CubeLiveWallpaper (动态壁纸的一个简单例程)| |-- FixedGridLayout (像是布局)| |-- GlobalTime (全球时间)| |-- HelloActivity (Hello)| |-- Home (Home)| |-- JetBoy (jetBoy游戏)| |-- LunarLander (貌似又是一个游戏)| |-- MailSync (邮件同步)| |-- MultiResolution (多分辨率)| |-- MySampleRss (RSS)| |-- NotePad (记事本)| |-- RSSReader (RSS阅读器)| |-- SearchableDictionary (目录搜索)| |-- SimpleJNI (JNI例程)| |-- SkeletonApp (空壳APP)| |-- Snake (snake程序)| |-- SoftKeyboard (软键盘)| |-- Wiktionary (?维基)| `-- WiktionarySimple(?维基例程)|-- scripts (脚本)|-- sdk (sdk配置)|-- simulator (?模拟器)|-- testrunner (?测试用)`-- tools (一些工具)external 目录.|-- aes (AES加密)|-- apache-http (网页服务器)|-- astl (ASTL (Android STL) is a slimmed-down version of the regular C++ STL.)|-- bison (自动生成语法分析器,将无关文法转换成C、C++)|-- blktrace (blktrace is a block layer IO tracing mechanism)|-- bluetooth (蓝牙相关、协议栈)|-- bsdiff (diff工具)|-- bzip2 (压缩工具)|-- clearsilver (html模板系统)|-- dbus (低延时、低开销、高可用性的IPC机制)|-- dhcpcd (DHCP服务)|-- dosfstools (DOS文件系统工具)|-- dropbear (SSH2的server)|-- e2fsprogs (EXT2文件系统工具)|-- elfcopy (复制ELF的工具)|-- elfutils (ELF工具)|-- embunit (Embedded Unit Project)|-- emma (java代码覆盖率统计工具)|-- esd (Enlightened Sound Daemon,将多种音频流混合在一个设备上播放)|-- expat (Expat is a stream-oriented XML parser.)|-- fdlibm (FDLIBM (Freely Distributable LIBM))|-- freetype (字体)|-- fsck_msdos (dos文件系统检查工具)|-- gdata (google的无线数据相关)|-- genext2fs (genext2fs generates an ext2 filesystem as a normal (non-root) user)|-- giflib (gif库)|-- googleclient (google用户库)|-- grub (This is GNU GRUB, the GRand Unified Bootloader.)|-- gtest (Google C++ Testing Framework)|-- icu4c (ICU(International Component for Unicode)在C/C++下的版本)|-- ipsec-tools (This package provides a way to use the native IPsec functionality )|-- iptables (防火墙)|-- jdiff (generate a report describing the difference between two public Java APIs.)|-- jhead (jpeg头部信息工具)|-- jpeg (jpeg库)|-- junit (JUnit是一个Java语言的单元测试框架)|-- kernel-headers (内核的一些头文件)|-- libffi (libffi is a foreign function interface library.)|-- libpcap (网络数据包捕获函数)|-- libpng (png库)|-- libxml2 (xml解析库)|-- mtpd (一个命令)|-- netcat (simple Unix utility which reads and writes dataacross network connections)|-- netperf (网络性能测量工具)|-- neven (看代码和JNI相关)|-- opencore (多媒体框架)|-- openssl (SSL加密相关)|-- openvpn (VPN开源库)|-- oprofile (OProfile是Linux内核支持的一种性能分析机制。
PBK学习总结
删除联系人
1. 删除单个,多个或者所有联系人 2. 在编辑联系人时删除联系人 3. 删除很多联系人做一些冲突测试。容易发现一些严重问题。
3
手机联系人
导入/导出
1. 从SIM card导入/导出:导入不同格式单个或者多个, 2. 从 SD card导入/导出:导入不同格式单个或者多个 3. 在导入/导出很多联系人时,做一些交互也是问题的多发点
11
ADN (Abbreviated dialing number)
EFADN
如果 联系人的号码超过20个数字,length of BCD number/SSC contents这一个byte将由不等于FF的扩 展1标识符表示 是EFccp1记录标识,表示在EFccp1文件中的某个记 录中是否保存有与该电话簿条目相应的能力和配置 信息。 号码前20位后面的部分在EFext1中;保存在EFext1 中剩余号码的位置信息保存在Extersion1 Record Identifier这一个byte里 TON :Type of number 号码类型 NPI :Numbering plan identification 编码方案 识别
可以存储5个群组 Group 1-5分别代表5个 群组 第一列的数字代表SIM 卡里的联系人编号 Group下面0表示对应的 联系人没有在该群组
18
Sync
基本的测试点
建立一个gmail帐号在手机里, 1.在手机端新建/编辑联系人,同步到gmail 帐号里面,看是否能同步过来 并且同步后的内容正确 2.在PC gmail帐号里新建/编辑联系人,同步到手机里面,看是否能同步过 来并且同步后的内容正确 3.在PC gmail帐号里删除联系人,同步后,手机里面删除的联系人会消失, 如果在手机端删除联系人,同步后,gmail帐号里也会删除该联系人 4.同步多个联系人,看同步后的数量是否正确。 举个例子,手机和gmail里本来有A、B两个联系人,然后在手机或 gmail任意一端添加联系人C,同步完成后,两端就都有A、B、C三人了;同样, 现在有A、B、C三人,然后在手机或gmail任意一端删除联系人A,同步完成后, 两端就都只剩下B、C俩联系人了。所以如果你把手机里的一个联系人删掉, 再想从gmail里把删掉的联系人同步回来,这是是不行的
button的contact接口具体使用方法
button的contact接口具体使用方法Button是一种非常流行的移动应用开发框架,它提供了许多实用的接口,其中包括Contact接口。
Contact接口用于在应用中实现用户与用户之间的交互,为用户提供了更加便捷的社交体验。
一、接口简介Contact接口是Button框架中的一个重要接口,它允许应用与用户的联系人列表进行交互。
通过Contact接口,应用可以请求用户授权访问联系人信息,并将联系人添加到应用的通讯录中。
此外,应用还可以通过Contact接口实现消息发送、接收和提醒等功能。
二、使用步骤1. 配置权限:在使用Contact接口之前,需要先配置应用的权限。
这通常需要在应用的设置页面中进行,确保应用获得了访问联系人信息的权限。
2. 请求授权:当用户需要访问其联系人信息时,应用可以通过Button框架提供的API请求用户授权。
在请求中,需要提供必要的提示信息和引导用户操作。
3. 实现交互:当用户授权后,应用可以通过Contact接口实现与联系人列表的交互。
例如,可以将联系人添加到应用的通讯录中,或者发送消息给指定的联系人。
4. 监听提醒:为了提高用户体验,应用可以通过Button框架提供的API监听Contact接口的提醒事件,并在用户操作完成后进行相应的处理。
三、示例代码以下是一个简单的示例代码,演示了如何使用Button的Contact 接口:```pythonimport button# 初始化Button实例button_instance = button.Button()# 请求授权访问联系人信息button_instance.request_contacts_access()# 监听提醒事件button_instance.on_contact_alert.connect(handle_contact_a lert)# 处理提醒事件def handle_contact_alert(event):# 获取已授权的联系人列表contacts = event.data['contacts']# 遍历联系人列表,实现相应的操作,例如发送消息等for contact in contacts:# 这里只是一个示例,实际应用中需要根据具体情况实现相应的逻辑message = "你好," + contact['name'] + "!这是通过Button发送的一条消息。
android电话薄contacts操作增 删 改 收藏
电话薄contacts操作增删改收藏本文章转自/topic/253346,感谢人兄的奉献精神电话薄在实际的开发中还是很常见的,在论坛中经常有人问,回答的也是事实而非,今天有空做点记录吧。
电话薄的开发无非就是对联系方式的增、删、改、查四种操作,这里可要注意了,在Android 里面给用户的权限更大,可以修改和删除已有的联系人的信息,与J2me PIM不一样哦。
在Android系统里面正对联系人的操作是被划分在Content Providers里面,用做好类似的开发,需要了解的知识:Uri(不是Url)、Android的权限控制、Android的联系方是表的字段等等。
有了上面的知识其实就可以开发增删改查的功能了,在网络上面看的基本只有增和查,在这里重点也在更新和删除,注意在做涉及到网系统读写的操作的时候,要在你的AndroidMainfest.xml里面把权限打开:<uses-permission android:name="android.permission.WRITE_CONTACTS" /><uses-permission android:name="android.permission.READ_CONTACTS" />这里读和写的权限都要打开,与我们一般的思路有点不一样,这里读写权限是分开的,要是还想打电话就要也要把其对应的权限打开<uses-permission android:name="android.permission.CALL_PHONE" />这些都是一些很细节性的基础东西,对于初学者很有必要注意哦,有的时候这些简单的基础东西没有注意可能会然他你死活找不到bug所在。
废话少说,下面贴点代码:<1>添加:view plaincopy to clipboardprint?public boolean insert(String name, String phoneNum, String email, String qq) {if (name == null) {Log.e(TAG, "The Name is not allow null!!");return false;}try {ContentResolver contentResolver = mContext.getContentResolver();ContentValues values = new ContentValues();Uri phoneUri = null;// 添加姓名values.put(, name);// 映射关系:1 = 新的联系方式加入favorites,0 = 新的联系方式不是加入favoritesvalues.put(Contacts.People.STARRED, 1);Uri uri = Contacts.People.createPersonInMyContactsGroup(contentResolver, values);// 添加电话号码// 最好的办法是先得到People表的Uri,然后使用Uri的静态方法withAppendedPath来获取一个新的Uri作为我们新要插入数据的Uriif (phoneNum != null && !phoneNum.trim().equals("")) {phoneUri = Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY);values.clear();values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);values.put(Contacts.Phones.NUMBER, phoneNum);contentResolver.insert(phoneUri, values);}if (email != null && !email.trim().equals("")) {// 添加EmailUri emailUri = Uri.withAppendedPath(uri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);values.clear();// ContactMethods.KIND 是用来区分像email,im等等不同联系方式values.put(Contacts.ContactMethods.KIND, Contacts.KIND_EMAIL);values.put(Contacts.ContactMethods.DATA, email);values.put(Contacts.ContactMethods.TYPE,Contacts.ContactMethods.TYPE_HOME);contentResolver.insert(emailUri, values);}if (qq != null && !qq.trim().equals("")) {// 添加QQ号码values.clear();Uri qqUri = Uri.withAppendedPath(uri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);values.put(Contacts.ContactMethods.KIND, Contacts.KIND_IM);values.put(Contacts.ContactMethods.DATA, qq);values.put(Contacts.ContactMethods.TYPE,Contacts.ContactMethods.TYPE_HOME);contentResolver.insert(qqUri, values);}} catch (Exception e) {Log.e(TAG, "InsertContact Error !!!!");return false;}return true;}public boolean insert(String name, String phoneNum, String email, String qq) {if (name == null) {Log.e(TAG, "The Name is not allow null!!");return false;}try {ContentResolver contentResolver = mContext.getContentResolver();ContentValues values = new ContentValues();Uri phoneUri = null;// 添加姓名values.put(, name);// 映射关系:1 = 新的联系方式加入favorites,0 = 新的联系方式不是加入favoritesvalues.put(Contacts.People.STARRED, 1);Uri uri = Contacts.People.createPersonInMyContactsGroup(contentResolver, values);// 添加电话号码// 最好的办法是先得到People表的Uri,然后使用Uri的静态方法withAppendedPath来获取一个新的Uri作为我们新要插入数据的Uriif (phoneNum != null && !phoneNum.trim().equals("")) {phoneUri = Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY);values.clear();values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);values.put(Contacts.Phones.NUMBER, phoneNum);contentResolver.insert(phoneUri, values);}if (email != null && !email.trim().equals("")) {// 添加EmailUri emailUri = Uri.withAppendedPath(uri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);values.clear();// ContactMethods.KIND 是用来区分像email,im等等不同联系方式values.put(Contacts.ContactMethods.KIND, Contacts.KIND_EMAIL);values.put(Contacts.ContactMethods.DATA, email);values.put(Contacts.ContactMethods.TYPE,Contacts.ContactMethods.TYPE_HOME);contentResolver.insert(emailUri, values);}if (qq != null && !qq.trim().equals("")) {// 添加QQ号码values.clear();Uri qqUri = Uri.withAppendedPath(uri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);values.put(Contacts.ContactMethods.KIND, Contacts.KIND_IM);values.put(Contacts.ContactMethods.DATA, qq);values.put(Contacts.ContactMethods.TYPE,Contacts.ContactMethods.TYPE_HOME);contentResolver.insert(qqUri, values);}} catch (Exception e) {Log.e(TAG, "InsertContact Error !!!!");return false;}return true;}<2>删除:view plaincopy to clipboardprint?public boolean delete(String name) {ContentResolver contentResolver = mContext.getContentResolver();if (name != null)contentResolver.delete(Contacts.People.CONTENT_URI, + "=?", new String[] { name });elsecontentResolver.delete(Contacts.People.CONTENT_URI, null, null);return true;}public boolean delete(String name) {ContentResolver contentResolver = mContext.getContentResolver();if (name != null)contentResolver.delete(Contacts.People.CONTENT_URI, + "=?", new String[] { name });elsecontentResolver.delete(Contacts.People.CONTENT_URI, null, null);return true;}<3>更新:更新麻烦一点,需要先按更新条件找到记录所带的id,之后再做相应的操作view plaincopy to clipboardprint?ContentResolver contentResolver = mContext.getContentResolver();Cursor cusor = null;String[] projection = new String[] { Contacts.People._ID, , Contacts.People.NUMBER };cusor = contentResolver.query(Contacts.People.CONTENT_URI, projection, + "=?", new String[] { oldName }, + " ASC");cusor.moveToFirst();ContentValues values = new ContentValues();Uri uri = Uri.withAppendedPath(Contacts.People.CONTENT_URI, cusor.getString(cusor.getColumnIndex(Contacts.People._ID)));values.put(, newName);values.put(Contacts.People.STARRED, 0);values.put(Contacts.Phones.NUMBER, newPhoneNum);contentResolver.update(uri, values, null, null);ContentResolver contentResolver = mContext.getContentResolver();Cursor cusor = null;String[] projection = new String[] { Contacts.People._ID, , Contacts.People.NUMBER };cusor = contentResolver.query(Contacts.People.CONTENT_URI, projection, + "=?", new String[] { oldName }, + " ASC");cusor.moveToFirst();ContentValues values = new ContentValues();Uri uri = Uri.withAppendedPath(Contacts.People.CONTENT_URI, cusor.getString(cusor.getColumnIndex(Contacts.People._ID)));values.put(, newName);values.put(Contacts.People.STARRED, 0);values.put(Contacts.Phones.NUMBER, newPhoneNum);contentResolver.update(uri, values, null, null);本文来自CSDN博客,转载请标明出处:/wufenglong/archive/2010/07/27/5768179.aspx。
Android联系人Contacts详解
Android联系⼈Contacts详解1.获取联系⼈详细信息在(⼀)中我们只是获取了联系⼈的ID和NAME,但是这是远远不够的,怎么样获取其他的值呢?public void fetchContactInformation() {String id,name,phoneNumber,email;ContentResolver contentResolver = this.getContentResolver();Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null);while(cursor.moveToNext()) {id=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));name=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));//Fetch Phone NumberCursor phoneCursor = contentResolver.query(monDataKinds.Phone.CONTENT_URI,null, monDataKinds.Phone.CONTACT_ID+"="+id, null, null);while(phoneCursor.moveToNext()) {phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(monDataKinds.Phone.NUMBER));System.out.println("id="+id+" name="+name+" phoneNumber="+phoneNumber);}phoneCursor.close();//Fetch emailCursor emailCursor = contentResolver.query(monDataKinds.Email.CONTENT_URI,null, monDataKinds.Email.CONTACT_ID+"="+id, null, null);while(emailCursor.moveToNext()) {email = emailCursor.getString(emailCursor.getColumnIndex(monDataKinds.Email.DATA));System.out.println("id="+id+" name="+name+" email="+email);}emailCursor.close();}cursor.close();}结果:11-06 14:38:32.049: I/System.out(26534): id=4 name=张三 phoneNumber=1-234-5611-06 14:38:32.138: I/System.out(26534): id=5 name=李四 phoneNumber=654-32111-06 14:38:32.138: I/System.out(26534): id=5 name=李四 phoneNumber=987-654-32111-06 14:38:32.188: I/System.out(26534): id=5 name=李四 email=wssiqi@在这⾥,我们通过android.provider.ContactsContract.Contacts.CONTENT_URI 来获取联系⼈的ID和NAMEmonDataKinds.Phone.CONTENT_URI 获取联系⼈的电话号码monDataKinds.Email.CONTENT_URI 获取联系⼈的邮箱地址关键是ContactsContract下⾯有很多类,很不容易找到到底哪个类包含我们需要的内容。
contact在c语言中的用法
一、通联(contact)在C语言中的定义与基本用法在C语言中,contact是一个用于处理数据类型、变量和指针的基本概念。
在C语言中,contact的主要作用是将两个或多个数据结合在一起,使其成为一个整体。
contact可以适用于不同类型的数据,包括基本数据类型、结构体、指针等。
二、基本语法与用法在C语言中,contact的基本语法为“contact(数据1, 数据2)”,其中数据1和数据2可以是变量、常量或表达式。
在进行contact操作时,数据1和数据2的类型可以相同也可以不同。
如果类型相同,则数据1和数据2会被合并成一个具有相同类型的新数据;如果类型不同,则会进行隐式转换,将数据1和数据2转换成相同的类型再进行合并。
例如:int a = 10;float b = 3.14;contact(a, b);在以上例子中,a和b的类型分别为int和float,进行contact操作时会将b的类型转换为int,然后将a和b合并为一个int类型的新数据。
三、contact在结构体中的应用除了基本数据类型外,contact还经常用于结构体中。
在C语言中,结构体是一种自定义的复合数据类型,可以包含多个不同类型的成员。
当需要将多个结构体合并为一个整体时,可以使用contact操作。
例如:struct Point {int x;int y;};struct Point p1 = {1, 2};struct Point p2 = {3, 4};contact(p1, p2);在以上例子中,p1和p2是两个Point类型的结构体,进行contact操作时会将p1和p2合并成一个新的Point类型的结构体。
四、指针与contact的结合使用指针是C语言中非常重要的概念,通过指针可以对内存进行直接操作。
在C语言中,可以使用contact操作对指针进行合并。
例如:int a = 10;int *ptr = a;float b = 3.14;float *ptr2 = b;contact(ptr, ptr2);在以上例子中,ptr和ptr2是两个指向不同类型的变量的指针,进行contact操作时会将ptr2的类型转换为int*,然后将ptr和ptr2合并成一个int*类型的新指针。
button的contact接口具体使用方法 -回复
button的contact接口具体使用方法-回复题目:button的contact接口具体使用方法引言:在现代软件和应用程序中,为用户提供友好的交互体验是至关重要的。
为了满足这一需求,开发人员通常会使用各种交互元素。
其中一个常见的交互元素是按钮(button)。
按钮不仅可以用于执行特定操作,还可以帮助用户与应用程序进行联系。
本文将详细介绍按钮的contact接口,包括其使用方法和一些实例。
一、按钮的contact接口简介按钮的contact接口是一种API或功能,允许用户通过按钮与应用程序或网站进行联系。
当用户点击按钮时,应用程序会向预设的联系方式发送相应的信息,如电子邮件、短信等。
通过该接口,用户可以轻松地与应用程序的开发者或维护团队沟通,提供反馈或报告问题。
二、contact接口的使用方法要使用按钮的contact接口,开发人员需要按照以下步骤进行设置:步骤1:添加按钮元素首先,需要在应用程序或网站的用户界面中添加一个按钮元素。
按钮可以是一个普通的HTML按钮,也可以是应用程序特定的用户界面元素。
当用户点击按钮时,将触发联系的操作。
步骤2:定义联系操作接下来,需要定义按钮点击后所执行的操作。
联系操作可以是发送电子邮件、短信、打开联系表单等等。
开发人员需要根据应用程序的需求选择合适的操作。
步骤3:获取用户输入在执行联系操作之前,通常需要获取用户的输入信息。
这可以通过弹出对话框、在联系表单中收集用户输入、或直接将用户转至发送邮件或短信的应用程序来完成。
开发人员需要在此步骤中确保用户提供了必要的信息,以便联系操作能够成功执行。
步骤4:执行联系操作一旦获取了用户的输入,就可以执行联系操作了。
具体操作的实现方式取决于开发人员选择的联系方式。
例如,如果选择发送电子邮件,可以使用SMTP协议将填充好的邮件发送给预定的收件人。
如果选择发送短信,可以使用API调用短信服务提供商的接口来发送消息。
步骤5:提供反馈或响应在执行完联系操作后,建议开发人员为用户提供适当的反馈或响应。
android中联系人以及ContactsContract类
android中联系人以及ContactsContract类android中联系人以及ContactsContract类(2012-03-11 18:06:15)转载▼标签: android 联系人杂谈1.加入读写权限<uses-permissionandroid:name="android.permission.READ_CONTACTS" /> <uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />联系人信息Uri:content://com.android.contacts/contacts联系人电话Uri:content://com.android.contacts/data/phones联系人Email Uri:content://com.android.contacts/data/emails(推荐)也可以这样获取联系人信息Uri:Uri uri = ContactsContract.Contacts.CONTENT_URI;2.查询与添加联系人的操作(单元测试用例)public class ContactTest extends AndroidTestCase{private static final String TAG = "ContactTest";public void testGetAllContact() throws Throwable{//获取联系人信息的UriUri uri = ContactsContract.Contacts.CONTENT_URI;//获取ContentResolverContentResolver contentResolver = this.getContext().getContentResolver();//查询数据,返回CursorCursor cursor = contentResolver.query(uri, null, null, null, null);while(cursor.moveToNext()){StringBuilder sb = new StringBuilder();//获取联系人的IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.C ontacts._ID));//获取联系人的姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.C ontacts.DISPLAY_NAME));//构造联系人信息sb.append("contactId=").append(contactId).append(",N ame=").append(name);//查询电话类型的数据操作Cursor phones = contentResolver.query(monDataKinds. Phone.CONTENT_URI,null,monDataKinds.Phone.CONTACT_I D +" = "+ contactId,null, null);while(phones.moveToNext()){String phoneNumber = phones.getString(phones.getColumnIndex(monDataKinds.Phone.NUMBER));//添加Phone的信息sb.append(",Phone=").append(phoneNumber);}phones.close();//查询Email类型的数据操作Cursor emails = contentResolver.query(monDataKinds. Email.CONTENT_URI,null,monDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);while (emails.moveToNext()){String emailAddress = emails.getString(emails.getColumnIndex(monDataKinds.Email.DATA));//添加Email的信息sb.append(",Email=").append(emailAddress);}emails.close();Log.i(TAG, sb.toString());}cursor.close();}public void testInsert(){ContentValues values = new ContentValues();//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactIdUri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.C ONTENT_URI, values);//获取idlong rawContactId = ContentUris.parseId(rawContactUri);//往data表入姓名数据values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId); //添加idvalues.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//添加内容类型(MIMETYPE)values.put(StructuredName.GIVEN_NAME, "凯风自南");//添加名字,添加到first name位置this.getContext().getContentResolver().insert(android.pr ovider.ContactsContract.Data.CONTENT_URI, values);//往data表入电话数据values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);values.put(Phone.NUMBER,"139****9789");values.put(Phone.TYPE, Phone.TYPE_MOBILE);this.getContext().getContentResolver().insert(android.pr ovider.ContactsContract.Data.CONTENT_URI, values);//往data表入Email数据values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);values.put(Email.DATA,"******************");values.put(Email.TYPE, Email.TYPE_WORK);this.getContext().getContentResolver().insert(android.pr ovider.ContactsContract.Data.CONTENT_URI, values);}public void testSave() throws Throwable{//官方文档位置:reference/android/provider/ContactsContract.RawContacts. html//建立一个ArrayList存放批量的参数ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();int rawContactInsertIndex = ops.size();ops.add(ContentProviderOperation.newInsert(RawConta cts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build());//官方文档位置:reference/android/provider/ContactsContract.Data.html //withValueBackReference后退引用前面联系人的idops.add(ContentProviderOperation.newInsert(android.p rovider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.GIVEN_NAME, "小明").build());ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue(Phone.NUMBER,"136****3809").withValue(Phone.TYPE, Phone.TYPE_MOBILE).withValue(BEL, "手机号").build());ops.add(ContentProviderOperation.newInsert(android.p rovider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) .withValue(Email.DATA,"***************").withValue(Email.TYPE, Email.TYPE_WORK).build());ContentProviderResult[] results = this.getContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);for(ContentProviderResult result : results){Log.i(TAG, result.uri.toString());}}}********************************************************** *********************************************这里主要使用的是ContactsContract类从Android 2.0 SDK开始有关联系人provider的类变成了ContactsContract,虽然老的android.provider.Contacts能用,但是在SDK中标记为为deprecated将被放弃不推荐的方法,而从Android 2.0及API Level为5开始新增了android.provider.ContactsContract来代替原来的方法。
Contacts源码分析(一、概述)
Contacts源码分析(⼀、概述)代码版本: Contact code version: 4.4.2⼀打开Log开关:如if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate start");}打开: adb shell setprop log.tag.ContactsPerf VERBOSE该属性值取值顺序为【V,D,I,W,E,A,S】 A表⽰最⾼级别的⽇志,即assert;S表⽰Suppress,即停⽌该⽇志的输出。
次设置重启后实效,也可以将该属性添加在data/local.prop属性⽂件中,不同的是,只要存在local.prop,该⼿机重启与否都⼀样,可以打印VERBOSE⼆ Contact代码结构主要由Contacts, ContactsCommon, ContactsProvider三个⼯程组成1. Conctacts: UI, ⽤户交互逻辑⽂件⽬录packages/apps/Contacts2. ContactsCommon:实现了基类,⼯具类和⼀些数据结构供Contacts使⽤⽂件⽬录packages/apps/ContactsCommon3. ContactsProvider:联系⼈数据增删改⽂件⽬录packages/providers/ContactsProvider三数据库结构:device中存放位置/data/data/com.android.providers.contacts/databasescontacts2.db : 所有联系⼈信息profile.db : 个⼈信息1. contacts2.db 中⼏个重要的表,跟profile db中表结构差不多可以添加⼏个联系⼈然后把db⽂件下载下来⽤SQLiteSpy查看1) accounts⽤于同步contact的账号相关信息2) contacts联系⼈表,每个联系⼈对应⼀⾏,只存放⼀些标志性信息如raw contact id, starred, timestamp等,具体联系⼈信息存放在raw_contact和data表中。
camstar表结构
camstar表结构Camstar表结构详解Camstar是一种用于制造和生产管理的软件系统。
它提供了一套强大的工具和功能,用于跟踪、监控和优化制造过程,以确保产品质量和生产效率。
在Camstar中,表是用于存储和组织数据的基本结构。
表结构定义了表中的列和其属性,以及表之间的关系。
下面将详细介绍Camstar中常用的几个表结构。
1. User表User表存储了Camstar系统中的用户信息。
它包含了用户的姓名、工号、部门、角色等属性。
通过User表,系统可以管理和控制用户的访问权限,以及对用户进行身份验证和授权。
2. Material表Material表用于管理材料的信息。
它包含了材料的编号、名称、规格、供应商等属性。
通过Material表,系统可以跟踪和控制材料的采购、存储、使用和追溯,确保产品质量和安全性。
3. Equipment表Equipment表用于管理设备的信息。
它包含了设备的编号、名称、型号、状态等属性。
通过Equipment表,系统可以监控和维护设备的运行状态,以及进行设备维修和保养计划的管理。
4. ProductionOrder表ProductionOrder表用于管理生产订单的信息。
它包含了订单的编号、产品类型、数量、计划开始时间等属性。
通过ProductionOrder表,系统可以跟踪和控制生产订单的执行进度,以确保按时交付产品。
5. WorkInstruction表WorkInstruction表用于管理工作指导书的信息。
它包含了指导书的编号、名称、步骤、要求等属性。
通过WorkInstruction表,系统可以提供给操作人员详细的作业指导,确保操作的准确性和一致性。
除了上述表结构,Camstar还提供了其他许多表结构,如QualityEvent表、Defect表、Routing表等,用于管理质量事件、产品缺陷、生产工艺等信息。
这些表结构相互关联,形成了一个完整的数据模型,为制造和生产管理提供了全面的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ContactsContract.Data
long _ID read-only Row ID
String MIMETYPE read/write-once StructuredName.CONTENT_ITEM_TYPE ;Phone.CONTENT_ITEM_TYPE;Email.CONTENT_ITEM_TYPE ;Organization.CONTENT_ITEM_TYPE;Im.CONTENT_ITEM_TYPE ;Nickname.CONTENT_ITEM_TYPE ;Note.CONTENT_ITEM_TYPE;StructuredPostal.CONTENT_ITEM_TYPE;GroupMembership.CONTENT_ITEM_TYPE ;Website.CONTENT_ITEM_TYPE;Event.CONTENT_ITEM_TYPE ;Relation.CONTENT_ITEM_TYPE;
long PNOTO_ID read-only ContactsContract.Data table holding the photo. That row has the mime type CONTENT_ITEM_TYPE.
String DISPLAY_NAME_PRIMARY read-only 联系人显示的名字
long CONTACT_STATUS_TIMESTAMP read-only 插入或修改的最新时间
String CONTACT_STATUS_RES_PACKAGE read-only The package containing resources for this status: label and icon
String ACCOUNT_NAME read/write-once 账号名
String ACCOUNT_TYPE read/write-once 账号密码
int VERSION read-only 版本;当列或相关数据修改是,将会自动修改
int IS_SUPER_PRIMARY read/write Whether this is the primary entry of its kind for the aggregate contact it belongs to. Any data record that is "super primary" must also be "primary". For example, the super-primary entry may be interpreted as the default contact value of its kind (for example, the default phone number to use for the contact).
ContactsContract.Groups
long _ID read/write Row ID
String TITLE read/write The display title of this group
long CONTACT_STATUS_LABEL read-only The resource ID of the label describing the source of contact status, e.g. "Google Talk". This resource is scoped by the CONTACT_STATUS_RES_PACKAGE
long CONTACT_STATUS_ICON read-only The resource ID of the label describing the source of contact status, e.g. "Google Talk". This resource is scoped by the CONTACT_STATUS_RES_PACKAGE.
int GROUP_VISIBLE read-only 群组是否在数据库中可见1 or 0
int DELETED read/write 删除标记 0,default;1 if the row has been marked for deletion
int STARRED read/write 特别友好的联系人;1 if favorite;0 otherwise
int CUSTOM_RINGTONE read/write 与该记录相关的手机铃声
int SEND_TO_VOICEMAIL read/write 当这个Raw来电时,是否转发的语言信箱;1是或0否
int DELETED read/write 删除标记;0 or 1;1has been marked for deletion.
int TIMES_CONTACTED read/write 已经联系次数
long LAST_TI
String NOTE read/write Notes about the group
int SUMMARY_COUNT read-only The total number of Contacts that have monDataKinds.GroupMembership in this group. Read-only value that is only present when querying CONTENT_SUMMARY_URI.
int DIRTY read/write 版本发生改变的标记;同步的 当Raw contact发生改变时,自动设为1(除 URI has the CALLER_IS_SYNCADAPTER外)
ContactsContract.Contacts
Android 22Contacts表结构.txt两人之间的感情就像织毛衣,建立的时候一针一线,小心而漫长,拆除的时候只要轻轻一拉。。。。android 2.2联系人表结构
ContactsContract.RawContacts
long _ID read-only Row ID;update rather than to delete and re-insert it.
int SEND_TO_VOICEMAIL read/write
int CONTACT_PRESENCE read-only Contact IM presence status
String CONTACT_STATUS read-only Contact's latest status update. Automatically computed as the latest of all constituent raw contacts' status updates.
long _ID read-only Row ID.建议用LOOKUP_KEY代替
String LOOKUP_KEY read-only 与提示如何找到特定联系的值
long NAME_RAW_CONTACT_ID read-only
long LAST_TIME_CONTACTED read/write 上次联系的时间戳
String CUSTOM_RINGTONE read/write 与联系人相关的铃声
int STARRED read/write 是否是常用联系人
int IN_VISIBLE_GROUP read-only 这个联系人在UI中是否可见;
int HAS_PHONE_NUMBER read-only 该联系人否至少有一个手机号码
int TIMES_CONTACTED read-only 与该联系人联系的次数
long CONTACT_ID read-only ContactsContract.Contacts 中的ID
int AGGREGATION_MODE read/write 组合模式;值为AGGREGATION_MODE_DEFAULT, AGGREGATION_MODE_DISABLED 或AGGREGATION_MODE_SUSPENDED.
long RAW_CONTACT_ID read/write The id of the row in the ContactsContract.RawContacts table that this data belongs to.
int IS_PRIMARY read/write Whether this is the primary entry of its kind for the raw contact it belongs to. "1" if true, "0" if false.