为啥现在很多app进去都要查看我们通讯录,通话记录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥现在很多app进去都要查看我们通讯录,通话记录?相关的知识,希望对你有一定的参考价值。

参考技术A 放在以前,各类APP安装时需要的权限其实没有多少。而现在,哪怕是一款简简单单的APP,我们在安装时会发现它申请的权限也很多。这是为啥呢?我是 科技 和软件行业的工作者,所以对这一块还是比较了解的,现在将一些原因告诉大家:

1、 收集手机号资源 :

其实很多时候,APP安装时提示需要通讯录权限,这个权限可能和它本身的功能并没有什么关系,而是 APP服务商为了收集客户的资料,为后续的营销助力 。

2、 风控要求 :

其实很多APP是涉及风控的,比如像金融类APP、小额借贷类的APP,它们 为了风控需要,是要读取你的通讯录的,以便必要时能联系到你或者你的家人朋友。

所以我们经常在网络上看见,不少年轻人经历了网络借贷,然后遭到电话轰炸。我们了解了这个原理,其实就可以避免了,比如在安装这类APP时,通过手机手机严格禁止此APP读取通讯录权限,或者做个假的通讯录即可。

3、 实名制要求 :

随着工信部对于固话和手机的实名制要求, 现在的手机号已实现全面实名制了 。不像以前在大街上可以买到未实名的临时手机号,现在行不通了。

因为手机号是实名制的,所以一些 APP就可以通过用户的手机号绑定来实现实名认证流程,这样对于用户而言更加便捷 。按现在的趋势,未来手机号可能能证明一个人的身份。

综上,现在各类APP之所以要读通讯录,主要原因就是: 收集信息+实名制要求 。为了避免我们信息的泄露,建议大家在安装APP时拒绝此权限申请。当然了,有些APP如果读不了通讯录权限,甚至都无法正常运行,对于这类APP,如果必要则开启通讯录权限即可。

前面有回答说APP查看我们的通讯录和通话记录,是出于风控和实名制要求,很抱歉,我不认可这个理由哦。网贷/小额贷公司控制风险,要求的是贷款人提供身份证件,本人还要刷脸,联系电话也要验证的,哪有事后查看通讯记录、通话记录来控制风险的?真这么厉害,网络水军早被剿灭的干干净净。

真正的原因, 是 APP开发商利用通讯录、通话记录搜集个人隐私信息,无数人的这些信息汇成大数据,然后开发商利用这些大数据完成营销、推广,接地气儿说就是薅羊毛。

那么,APP开发商是如何利用大数据营销的呢?

首先,需要搜集用户信息,APP查看我们的通讯录、通话记录就是在搜集信息:通讯录记载了我们的社交信息(包括朋友、亲属、同事等),而通话记录可以反映通话频次、地理信息,从而分析出社交偏好、爱好等重要的个人隐私信息,再根据这些信息推送相应的广告。

举个简单的例子,你的通讯记录里有外卖电话,而且每个月有6次(列了个日常数字,方便说明)和外卖通话记录,连续四五个月都是如此,那么你的个人画像为喜欢 美食 ,而且爱用外卖的方式解决,APP开发商分析出这条信息后,可以通过APP向你弹送外卖广告,展开营销。

实际上,APP开发商还有一种简单粗暴的营销推广方式,查看你的通讯录后,再通过同步通讯录的方式,告诉你通讯录中其他联系人:”你的好友XX正在使用XXAPP“,通过短信的形式诱导他们下载该APP。

总之,除去部分APP为运行 正常 功能(外卖APP、地图APP必须索要定位权限,美颜APP必须索要摄像头权限,否则无法运用正常功能)而索要用户必要权限外,有部分APP向用户索要过多权限,就属于为营销而恶意侵犯隐私了。

这种APP,如果不是通讯类的还必须要允许访问通讯录联系人等,那么多半就是个流氓软件!

一般来说正规的APP只会建议开启通讯录,这些APP对我们不会造成太大的影响,它们无非是先根据你的通讯录帮你找到其他也正在使用这款软件的朋友,或是“自作主张”的推荐给通讯录中的其他人,这种权限我们完全可以选择不开启,对正常使用该软件几乎没有任何影响,如果以后需要开启也可以自己手动打开。

除了正规APP,其他的流氓软件不但会要求开启通讯录、通话记录,有些甚至会要求必须打开地理位置、允许删除通话记录、读取短信等,如果不允许,软件就无法使用一直闪退,这个时候建议大家还是直接删掉这个软件吧,否则你就会像“裸奔”一样暴露在这款APP面前。

举个例子,百度地图也会要求打开地理位置权限,但不打开同样可以进入软件,大不了就是无法获取当前位置没办法导航,手动输入位置后就可以查看路线了,在这种大数据时代,很多APP都在通过收集用户个人信息赚钱,如果允许了恶意APP查看通讯录,他们很有可能会根据你的通话记录和通讯录找到你的家人朋友然后把这些电话号捆绑出售。

下载APP时,最好选择正规的应用商店或官网,下载之前先查看软件有没有非常过分的权限要求以及下载人数和有没有广告,并不是说应用商店的软件就一定是非常安全和正规的,凡事没有绝对,他们完全可以不带任何病毒或捆绑插件只需要开启你的手机权限,然后贩卖。
更多优质内容,请持续关注镁客网~~

我本身是一个APP开发者 ,所以,知道的较多。

目前,你能知道很多APP需要查看你的通讯录、通话记录, 这个事情本身是好事。

安卓手机
放在以前,安卓手机要访问你的手机内存、通讯录、通话记录, 你根本不知道!

为什么这么说?

在以前,安卓手机系统还没有那么完善,但是其用户已经非常的多了。

需求变多之后,不光催生了一大堆的APP开发人员,也让某些人,产生了不好的想法。

那个时期,想什么流氓软件,你安装了之后,根本卸载不了。

像什么劫持APP页面的流氓APP,也有很多。

系统完善
现在,安卓手机经过这些年的发展,已经越来越完善了。

现在要访问手机的私密, 就要获取权限。

而获取数据,必须在用户授权后,才能获取到数据!
通讯录,通话记录用来干啥?
不同公司的不同APP,都会访问不同的权限。

其中,获取通讯录权限的比较多。

那么获取这方面权限为了干什么?

一种是为了产品更好的推广 ,当获取到了通讯录之后,就可以对比手机中的人群,那些还没有注册,那些已经注册。

没注册的可以邀请,注册了的可以互动,增加用户粘性。

另一种,就是金融类APP了 ,他们获取通讯录,通话记录,是为了风险控制。

比如说贷款APP,就要获取你手机的通讯录信息,来记录你的联系人,为了以后方便追帐。

那可以用新手机吗?

可以,但是这些公司的风控部门查不到通讯录信息,就会考虑要不要给你放款。

同理,通话记录也是如此!

当然,是否要授权给对应的APP,需要自己把握,如果你相信这款APP,那就授权,不相信,那就不授权,不使用!

比如,使用一个记事本的APP,它要访问你的摄像头、存储权限。

但你只想当一个记事本使用,这个时候,你觉得没必要,就不授权。

如果不授权就用不了,卸了这种流氓软件,换一个吧!

现在大多数安卓应用都会读取你的联系人、位置等权限。

虽然安卓系统可以禁止这些应用读取关键权限,但有的应用不开放相关权限的话就无法启动,非常令人头疼。那么这些应用取得这些权限究竟有什么用呢?目前应用经常用到的权限有以下几种:

一、联系人
这是最普遍的,几乎所有安卓应用都会读取你的通讯录联系人。从功能上来讲,读取联系人可以判断你的亲朋好友中有没有人使用同样的应用。比如微信的“添加朋友”里面有一个“手机联系人”,就需要用到手机通讯录的权限。通过这个权限可以看到你的通讯录中有谁也在用微信,方便添加好友。

当然,通讯录属于比较敏感的权限,正规的应用如果你不给它这个权限也能够正常使用,只不过类似查找通讯录好友的功能就用无法开启了。

二、位置
几乎所有的手机应用APP都会要求获取你的位置,因为只有知道你的位置才能够确定你是哪里人,需要什么生活服务。比如天气、外卖、叫车、本地新闻等功能,没有位置权限根本无法正常工作。如果你把微信的位置权限给关闭了,它就会拒绝启动。

另外手机的一些关键功能也许要位置全新,比如苹果的“查找我的iPhone”就是通过定位来实现的,如果关闭了位置功能,就无法定位手机的位置,手机丢失了也就无法再找回来了。

三、读取和发送短信
和短信相关的权限就比较敏感了,因为短信中包含了很多隐私内容,比如银行的帐号、验证码甚至密码等。如果泄露了这些关键短信内容,后果不堪设想。

而如果给予应用发送短信的权限,一些不正规的应用就有可能会在后台偷偷发送一些订购收费服务的短信,比如彩铃、 游戏 虚拟道具等。甚至可以在不知不觉中吸干用户的话费。所以一般情况下应该禁止应用读取和发送短信。

当然,让应用读取短信也有一个好处,就是当接受验证码的时候,应用可以自动读取验证码中的内容,省的用户再手动填写验证码。这一功能在手机支付等需要验证码的场合比较方便。

四、手机识别码
这个权限几乎所有的应用都会用到,手机识别码可以帮助应用确定你使用的是什么型号的手机,这对于用户来说基本上没有什么用。但对于应用开发者却十分有帮助,它可以帮助应用开发者统计使用这款应用的手机型号有哪些,有时候可以针对一些热门手机开发专门的功能。

比如iPhone 6s之后的苹果手机都配备了压感屏幕,一些应用就可以针对这种屏幕设计快捷菜单,并且根据手机识别码来判断,如果是iPhone 6s之后的手机,就可以启动压感屏幕的功能。

五、摄像头
很多用户觉得摄像头功能十分敏感,担心应用拥有摄像头权限之后会泄露隐私。但是现在很多应用都有扫一扫功能,如果不给它摄像头权限,那么扫一扫就无法正常使用了。当然如果一款应用不具备任何扫码和拍照功能,却要求摄像头权限,这个时候就需要注意了。

六、读写存储空间
这应该是比较基本的权限了,因为如果无法读写存储空间的话,应用就无法往手机中增加内容,比如下载和保存图片、视频什么的。 游戏 也许要通过写入存储空间来完成版本更新。几乎所有的应用都会用到读写存储空间的权限。

目前的手机APP在安装时都会索取用户手机上的相应功能,比如读取通讯录和通话记录、定位手机所在位置、摄像头使用权限等,有些APP要求的一些权限与其主要功能毫不相干。手机APP过度索取用户手机信息,这种情况可以分为三类:一种是申请获得用户隐私信息的权限留作备用,但是并不上传到其公司服务器;第二种是申请获得用户的隐私信息权限,然后将用户的隐私信息上传到其公司;第三种情况就是滥用已经上传到公司的用户隐私,包括用户的通讯录、通话记录及定位等隐私信息。

智能手机普及以后,手机APP寻求的权限越来越多。目前,一款手机APP只有具备了社交功能,可以做二次营销,才更有价值,也才能获得风险投资的青睐。“比如这个手电筒类APP,获取用户的定位信息后,就可以推送机主所在位置周边商家的广告。借助对用户定位信息,这款APP的商业价值就放大了。”

现在很多人习惯在手机上使用打车软件,拼车在都市白领中也很流行。国内有个拼车手机APP,安装时要求用户允许读取手机里的通讯录。但是,拼车去年公开提供下载的版本却偷偷将用户通讯录上传到本公司,而且竟然是以明文的方式上传用户手机号码,没有加密,任何有能力截获该信息的人都能看到该手机APP上传的用户通讯录,就如同在读一个Word文档一样。

另外一款手机APP,会将用户手机里的短信内容上传给本公司,而且在上传的时候,仅仅做过简单的编码。技术人员说,正版软件使用明文上传手机用户隐私信息最大的安全风险在于遭遇中间人攻击,如手机用户连接不安全的WiFi后,不法分子拦截了手机和WiFi之间的通信,这些使用明文传输的个人隐私数据就会直接被非法获取。

总结
现在很多手机应用都要求各种各样的权限,其中以联系人、短信、位置和手机识别码最为普遍,一方面是因为这几个权限的确是最常用到的。另一方,很多软件公司也在手机这些和用户隐私擦边的敏感数据,然后通过“大数据”、“云计算”等方式,来判断用户的喜好,并推送相关的广告内容。

比如用户在手机浏览器中搜索某款3C产品的信息,随后打开某东、某宝的应用之后,有很大机率能够看到相关3C产品的广告。这就是因为购物应用读取了用户的浏览器搜索记录,然后自动判断用户对这些产品有需求,从而开始有针对性的推送相关的广告。

尽管这些功能会让人产生隐私被窥探的感觉,但对于人们的日常生活其实也是有一定帮助的。不过有一定需要注意的是,在安装一些来历不明的应用时一定要注意避免开放关键权限,比如短信的读取和发送、相册的读取等。现在国产手机的系统也都做的十分人性化,在应用使用关键权限的时候都会有弹窗提示,尽可能的保护了用户的隐私不被泄露。

手机APP调用我们的通讯录信息可以分为两种情况:

那么,一起来看看APP为何会调用通讯录信息,又该如何避免个人信息的泄露呢?

手机软件APP为何会查看我们的通讯录
首先,我们先来说说良性调用,常见需要调用通讯录的多为一些社交软件。例如微信、QQ、飞聊等软件,调用我们通讯录的信息有利于软件快速的帮助我们建立社交圈,这样用户可以灵活的选择是否添加通讯录中的好友。同时,通过用户关系的捆绑,能够增强用户使用软件的黏性,避免用户出现流失。

其次,我们再来说说恶性调用。分为两种情况,一类软件安装时会询问您是否授权访问,一类软件会偷偷在后台盗用您的相关信息。此类调用并非软件功能所需,而是淡村的为了获取个人数据,通过贩卖个人数据来获得非法的利润。

如何杜绝手机软件的恶意调用
苹果的ios系统相对来说要好一些,只要软件安装均需要通过苹果商城才能下载使用(不过,苹果手机自带的后门程序较多,对于信息安全要就较高的也不建议使用)。问题较为严重的就是安卓手机,安卓手机软件安装的灵活性太强,无法确定随意安装的程序中是否存在恶意软件。这里建议大家使用手机厂家内置的软件市场进行下载,毕竟所有上传的软件已由厂商为我们进行了初次的把关。除此之外,对于较为默生的软件,安装时需要调用通讯录信息时,可以选择不允许,当软件具体使用通讯录信息时在进行放行。

对于一些陌生网站,大家也尽量不要填写个人数据。例如默些以手机号码来进行算命的网站,输入姓名的网站等等,殊不知,个人信息就这样悄悄的泄露出去。

不知道您是否因为个人信息的泄露遇到骚扰电话呢,最终是如何处理的呢?

现在的手机应用对用户权限的索取越来越多,他们的理由是让软件可以更好的运行。 实际上,建议大家在安装完软件打开后,当提示说索要通讯录权限时,尽量点击取消,不要给通讯录权限。 其他的权限,可根据软件的性质,适当的给到它,从而保证软件功能完整。

最近几年还好了些,因为手机系统的不断升级,加强了用户关系,所以软件索要权限都有提示,在早期的时候,连提示都没有,当我们打开软件后,默认获取它想要的权限。

如今人们的很多信息都是保存在手机里的,通讯录也是最有价值的信息。所以, 很多软件启动后在索要一些必要权限的同时,也会索要通讯录权限,这种情况下是可以完全不给它的,而且,不给它也并不会影响使用。

就拿支付宝来说,这是阿里巴巴旗下的APP,不管是安全性还是信任度方面,肯定是问题的吧。但是我也不会给它通讯录权限,照样使用的很正常。虽然每次通过支付宝给手机缴费的时候会提示我打开通讯录权限,但我每次都是自己手动输入,也照样不会存在使用问题。

试想一下你会发现,连支付宝这样的软件不给它通讯录权限都可以很好的运行,其他一些功能型的应用(如某某相机、某某天气等)给它通讯录权限有何用?

现在大环境比较好,流氓软件相对少了很多。但也不乏一些软件,根本用不到通讯录,而还是会索要用户的通讯录权限。其实也是为了做营销、做推广之类的。在此, 特意提醒大家,对于金融类的APP,一定别给它们通讯录权限。否则的话,它们会通过分析你的通讯录列表、信息等,以后给你或你通讯列表里的人发各种垃圾广告。

其实,如果你有留意的话就会发现,大部分APP在使用过程中并没有需要通讯录信息的,可是首次打开的时候却都会索要这一权限。站在用户角度来看的话,你可能没有什么损失,这只是你不知道,但站在开发商角度的话,它们就又获取了一批“手机号码”以及可供它们分析的短信“信息”。对于不良的开发商,可能就会做一些别有用心的事儿了。

所以,我给大家的建议就是, 当我们首次打开刚刚安装的软件时,不管它是什么软件,都不要给它通讯录权限。假如在后续使用时候,发现该软件确实需要此权限才能正常运行的话,那么可根据需要决定,要不要给它权限。这样,就能很好的保护自己的通讯信息不被泄露。

我是程序员爱编程,我从事互联网软件开发多年,我来回答一下这个问题。

我认为一些手机app在运行时会要求获取相应权限,我们要根据该app的性质和功能来判断它是否应该获取该项权限。
获取手机通讯录访问权限

一般情况下,带有社交性质的app都会要求获取手机通讯录的访问权限,例如qq、微信、飞聊等等。它的目的是为了根据你通讯录的手机号为我们推荐你的潜在好友。我们也可以选择不开启,app依然可以正常使用,之后我们也可以在软件设置中手动开启。

获取手机位置的权限
手机定位对于我们来讲也非常重要,一般带有导航性质的app会要求获取手机位置权限,例如各种地图、美团、各种快递等等。它的目的是定位我们的位置,为我们提供一些身边的服务。同样我们也可以选择不开启,之后在软件设置中开启。

获取通话记录的访问权限
说实话,这项权限在我使用的app中还没有遇到过,估计那些辅助拨号软件和辅助短信软件会用到吧,例如无忧通话录音等等。我觉得通话记录和短信过于私密,不建议对任何软件开通通话记录和短信的访问权限。

所以,我们要根据软件的用途来判断我们是否需要提供相应的权限给它, 如果我们不赋予权限app就不能用,那一定是流氓软件,一定要远离。

很简单啊,人家要你的数据,要你的关系链,进行推广和二次营销,从而获得更多的用户或者收益!

APP读取通讯录后就可以知道你这个当前用户有哪些联系人,是怎样一个关系链情况,同时通过其后台的大数据进行分析统计,然后再有针对性的对你通讯录上的人进行骚扰营销,最简单的方式可能就是发一条短信。

这里我举个例子,之前我经常收到脉脉的短信,上面写的是这样的:xx,某某对你很期待!ta向你发出邀请,希望添加你为最重要的职场人脉等等。

我一看,这某某就是我以前的同事,第一反映就想点短信中的链接。你看,脉脉这营销手段是可以的吧!其实这就是读取对方的通讯录后,系统自动根据通讯录上的手机号进行自动发送,从而诱导你来安装他的APP。由于通讯录上的联系人,基本上都是和你相关和认识的人,利用这种关系来进行营销,人们的戒备心理会不自然的下降,很容易上钩。而脉脉这种方式,还算 是 简单粗暴的,完全还可以更精准更隐蔽。

所以你知道现在为什么诈骗电话、垃圾短信这么多吗?很大程度就是我们把自己的信息交出去了,然后人家APP厂商再进行二次开发,好点的厂商就自己用,恶心点的就将你的信息在转手出去,然后咱们的信息就在黑色产业链中被充分利用。

现在我们的手机号承载着太多内容了,很多服务的帐号都是直接以手机号注册的,虽然注册时省事了,但是你的帐号安全性也更差了,APP读取下通讯录这些信息全有了。所以,对于莫名索取我们通讯录的APP应该说NO,而不是随意开放这个权限,并且是第一读取时就制止,等后续禁止就已经晚了。
感谢阅读,给点个赞鼓励下吧,欢迎关注【罗氏虫社】,谢谢!

我是一名产品经理,在项目过程中经常会遇到需要获取用户设备什么权限的问题,其中就包括通讯录这些。

首先说一下获取设备某个权限这件事情,这本身是android和iOS系统为保护用户所做的权限管理行为,app在获取对应权限时必须经过用户同意,否则无法获得相应信息,所以就有了我们作为用户经常看到的,新安装一个app,会提示需要获取某个权限的弹框提示。

再说所为什么要获取通讯录,这主要是基于我们的通讯录,也就是手机号码,去匹配产品内的用户,使用场景有看你联系人好友有哪些,你可以邀请哪些通讯录好友成为新用户等等,主要还是基于产品某个功能的需要。但是有时候app确实存在过度索取权限的情况,如果你觉得这些权限不想交出去,可以拒绝,只不过相应的功能你就无法使用。

最终的决定权还是在用户手上。

Android通讯录管理(获取联系人通话记录短信消息)

 

http://blog.csdn.net/wwj_748/article/details/19970271

 
Android通讯录管理(获取联系人、通话记录、短信消息)(二)
技术分享 分类:

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

 

前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现。

 

技术分享

 

同样的,你可以到这里下载源码:http://download.csdn.net/detail/wwj_748/6962865

 

 

界面布局:

/Contact_Demo/res/layout/contact_record_list_view.xml

 

[html] view plaincopy技术分享技术分享
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/contact_record_view"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"   
  6.     android:background="#000000">  
  7.   
  8.     <ListView  
  9.         android:id="@+id/call_log_list"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="fill_parent"  
  12.         android:layout_alignParentTop="true"  
  13.         android:cacheColorHint="#000000"  
  14.         android:fadingEdge="none"  
  15.         android:scrollingCache="false"  
  16.         android:visibility="visible" />  
  17.   
  18. </RelativeLayout>  

/Contact_Demo/res/layout/contact_record_list_item.xml

 

 

[html] view plaincopy技术分享技术分享
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/call_type"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_centerVertical="true"  
  12.         android:layout_marginLeft="5dip"  
  13.         android:layout_marginRight="5dip"  
  14.         android:background="@drawable/ic_calllog_outgoing_nomal" />  
  15.   
  16.     <LinearLayout  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_centerVertical="true"  
  20.         android:layout_toRightOf="@+id/call_type"  
  21.         android:orientation="vertical" >  
  22.   
  23.         <TextView  
  24.             android:id="@+id/name"  
  25.             android:layout_width="wrap_content"  
  26.             android:layout_height="0dip"  
  27.             android:layout_weight="1"  
  28.             android:textAppearance="?android:textAppearanceMedium"  
  29.             android:textColor="#ffffff" />  
  30.   
  31.         <TextView  
  32.             android:id="@+id/number"  
  33.             android:layout_width="wrap_content"  
  34.             android:layout_height="wrap_content"  
  35.             android:textAppearance="?android:textAppearanceSmall"  
  36.             android:textColor="#cccccc" />  
  37.     </LinearLayout>  
  38.   
  39.     <TextView  
  40.         android:id="@+id/call_btn"  
  41.         android:layout_width="wrap_content"  
  42.         android:layout_height="wrap_content"  
  43.         android:layout_alignParentRight="true"  
  44.         android:layout_centerVertical="true"  
  45.         android:layout_marginLeft="10dip"  
  46.         android:layout_marginRight="10dip"  
  47.         android:background="@drawable/ic_calllog_call_btn" />  
  48.   
  49.     <ImageView  
  50.         android:id="@+id/fg"  
  51.         android:layout_width="wrap_content"  
  52.         android:layout_height="75dip"  
  53.         android:layout_toLeftOf="@+id/call_btn"  
  54.         android:background="@drawable/black_bg" />  
  55.   
  56.     <TextView  
  57.         android:id="@+id/time"  
  58.         android:layout_width="wrap_content"  
  59.         android:layout_height="wrap_content"  
  60.         android:layout_centerVertical="true"  
  61.         android:layout_toLeftOf="@+id/fg"  
  62.         android:textColor="#ffffff" />  
  63.   
  64. </RelativeLayout>  

定义实体类:

/Contact_Demo/src/com/suntek/contact/model/CallLogBean.java

 

[java] view plaincopy技术分享技术分享
 
  1. package com.suntek.contact.model;  
  2.   
  3. /** 
  4.  * 通话记录实体类 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */  
  9. public class CallLogBean {  
  10.   
  11.     private int id;  
  12.     private String name; // 名称  
  13.     private String number; // 号码  
  14.     private String date; // 日期  
  15.     private int type; // 来电:1,拨出:2,未接:3  
  16.     private int count; // 通话次数  
  17.   
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.   
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.   
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.   
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     public String getNumber() {  
  35.         return number;  
  36.     }  
  37.   
  38.     public void setNumber(String number) {  
  39.         this.number = number;  
  40.     }  
  41.   
  42.     public String getDate() {  
  43.         return date;  
  44.     }  
  45.   
  46.     public void setDate(String date) {  
  47.         this.date = date;  
  48.     }  
  49.   
  50.     public int getType() {  
  51.         return type;  
  52.     }  
  53.   
  54.     public void setType(int type) {  
  55.         this.type = type;  
  56.     }  
  57.   
  58.     public int getCount() {  
  59.         return count;  
  60.     }  
  61.   
  62.     public void setCount(int count) {  
  63.         this.count = count;  
  64.     }  
  65.   
  66. }  


/Contact_Demo/src/com/suntek/contact/adapter/DialAdapter.java

 

[java] view plaincopy技术分享技术分享
 
  1. package com.suntek.contact.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.net.Uri;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.ViewGroup;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.ImageView;  
  14. import android.widget.TextView;  
  15.   
  16. import com.suntek.contact.R;  
  17. import com.suntek.contact.model.CallLogBean;  
  18.   
  19. /** 
  20.  * 电话记录适配器 
  21.  *  
  22.  * @author Administrator 
  23.  *  
  24.  */  
  25. public class DialAdapter extends BaseAdapter {  
  26.   
  27.     private Context ctx;  
  28.     private List<CallLogBean> callLogs;  
  29.     private LayoutInflater inflater;  
  30.   
  31.     public DialAdapter(Context context, List<CallLogBean> callLogs) {  
  32.         this.ctx = context;  
  33.         this.callLogs = callLogs;  
  34.         this.inflater = LayoutInflater.from(context);  
  35.     }  
  36.   
  37.     @Override  
  38.     public int getCount() {  
  39.         return callLogs.size();  
  40.     }  
  41.   
  42.     @Override  
  43.     public Object getItem(int position) {  
  44.         return callLogs.get(position);  
  45.     }  
  46.   
  47.     @Override  
  48.     public long getItemId(int position) {  
  49.         return position;  
  50.     }  
  51.   
  52.     @Override  
  53.     public View getView(int position, View convertView, ViewGroup parent) {  
  54.         ViewHolder holder;  
  55.         if (convertView == null) {  
  56.             convertView = inflater.inflate(R.layout.contact_record_list_item,  
  57.                     null);  
  58.             holder = new ViewHolder();  
  59.             holder.call_type = (ImageView) convertView  
  60.                     .findViewById(R.id.call_type);  
  61.             holder.name = (TextView) convertView.findViewById(R.id.name);  
  62.             holder.number = (TextView) convertView.findViewById(R.id.number);  
  63.             holder.time = (TextView) convertView.findViewById(R.id.time);  
  64.             holder.call_btn = (TextView) convertView  
  65.                     .findViewById(R.id.call_btn);  
  66.             convertView.setTag(holder); // 缓存  
  67.         } else {  
  68.             holder = (ViewHolder) convertView.getTag();  
  69.         }  
  70.   
  71.         CallLogBean callLog = callLogs.get(position);  
  72.         switch (callLog.getType()) {  
  73.         case 1:  
  74.             holder.call_type  
  75.                     .setBackgroundResource(R.drawable.ic_calllog_outgoing_nomal);  
  76.             break;  
  77.         case 2:  
  78.             holder.call_type  
  79.                     .setBackgroundResource(R.drawable.ic_calllog_incomming_normal);  
  80.             break;  
  81.         case 3:  
  82.             holder.call_type  
  83.                     .setBackgroundResource(R.drawable.ic_calllog_missed_normal);  
  84.             break;  
  85.         }  
  86.         holder.name.setText(callLog.getName());  
  87.         holder.number.setText(callLog.getNumber());  
  88.         holder.time.setText(callLog.getDate());  
  89.   
  90.         addViewListener(holder.call_btn, callLog, position);  
  91.   
  92.         return convertView;  
  93.     }  
  94.   
  95.     private static class ViewHolder {  
  96.         ImageView call_type;  
  97.         TextView name;  
  98.         TextView number;  
  99.         TextView time;  
  100.         TextView call_btn;  
  101.     }  
  102.   
  103.     private void addViewListener(View view, final CallLogBean callLog,  
  104.             final int position) {  
  105.         view.setOnClickListener(new OnClickListener() {  
  106.   
  107.             @Override  
  108.             public void onClick(View v) {  
  109.                 Uri uri = Uri.parse("tel:" + callLog.getNumber());  
  110.                 Intent intent = new Intent(Intent.ACTION_CALL, uri);  
  111.                 ctx.startActivity(intent);  
  112.             }  
  113.         });  
  114.     }  
  115. }  

/Contact_Demo/src/com/suntek/contact/ContactRecordListActivity.java

 

 

[java] view plaincopy技术分享技术分享
 
  1. package com.suntek.contact;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.ArrayList;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import android.app.Activity;  
  9. import android.content.AsyncQueryHandler;  
  10. import android.content.ContentResolver;  
  11. import android.database.Cursor;  
  12. import android.net.Uri;  
  13. import android.os.Bundle;  
  14. import android.provider.CallLog;  
  15. import android.widget.ListView;  
  16.   
  17. import com.suntek.contact.adapter.DialAdapter;  
  18. import com.suntek.contact.model.CallLogBean;  
  19.   
  20. /** 
  21.  * 通话记录列表 
  22.  *  
  23.  * @author wwj 
  24.  *  
  25.  */  
  26. public class ContactRecordListActivity extends Activity {  
  27.     private ListView callLogListView;  
  28.     private AsyncQueryHandler asyncQuery;  
  29.     private DialAdapter adapter;  
  30.     private List<CallLogBean> callLogs;  
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.contact_record_list_view);  
  36.   
  37.         callLogListView = (ListView) findViewById(R.id.call_log_list);  
  38.         asyncQuery = new MyAsyncQueryHandler(getContentResolver());  
  39.         init();  
  40.     }  
  41.   
  42.     private void init() {  
  43.         Uri uri = android.provider.CallLog.Calls.CONTENT_URI;  
  44.         // 查询的列  
  45.         String[] projection = { CallLog.Calls.DATE, // 日期  
  46.                 CallLog.Calls.NUMBER, // 号码  
  47.                 CallLog.Calls.TYPE, // 类型  
  48.                 CallLog.Calls.CACHED_NAME, // 名字  
  49.                 CallLog.Calls._ID, // id  
  50.         };  
  51.         asyncQuery.startQuery(0, null, uri, projection, null, null,  
  52.                 CallLog.Calls.DEFAULT_SORT_ORDER);  
  53.     }  
  54.   
  55.     private class MyAsyncQueryHandler extends AsyncQueryHandler {  
  56.   
  57.         public MyAsyncQueryHandler(ContentResolver cr) {  
  58.             super(cr);  
  59.         }  
  60.   
  61.         @Override  
  62.         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {  
  63.             if (cursor != null && cursor.getCount() > 0) {  
  64.                 callLogs = new ArrayList<CallLogBean>();  
  65.                 SimpleDateFormat sfd = new SimpleDateFormat("MM-dd hh:mm");  
  66.                 Date date;  
  67.                 cursor.moveToFirst(); // 游标移动到第一项  
  68.                 for (int i = 0; i < cursor.getCount(); i++) {  
  69.                     cursor.moveToPosition(i);  
  70.                     date = new Date(cursor.getLong(cursor  
  71.                             .getColumnIndex(CallLog.Calls.DATE)));  
  72.                     String number = cursor.getString(cursor  
  73.                             .getColumnIndex(CallLog.Calls.NUMBER));  
  74.                     int type = cursor.getInt(cursor  
  75.                             .getColumnIndex(CallLog.Calls.TYPE));  
  76.                     String cachedName = cursor.getString(cursor  
  77.                             .getColumnIndex(CallLog.Calls.CACHED_NAME));// 缓存的名称与电话号码,如果它的存在  
  78.                     int id = cursor.getInt(cursor  
  79.                             .getColumnIndex(CallLog.Calls._ID));  
  80.   
  81.                     CallLogBean callLogBean = new CallLogBean();  
  82.                     callLogBean.setId(id);  
  83.                     callLogBean.setNumber(number);  
  84.                     callLogBean.setName(cachedName);  
  85.                     if (null == cachedName || "".equals(cachedName)) {  
  86.                         callLogBean.setName(number);  
  87.                     }  
  88.                     callLogBean.setType(type);  
  89.                     callLogBean.setDate(sfd.format(date));  
  90.   
  91.                     callLogs.add(callLogBean);  
  92.                 }  
  93.                 if (callLogs.size() > 0) {  
  94.                     setAdapter(callLogs);  
  95.                 }  
  96.             }  
  97.             super.onQueryComplete(token, cookie, cursor);  
  98.         }  
  99.     }  
  100.   
  101.     private void setAdapter(List<CallLogBean> callLogs) {  
  102.         adapter = new DialAdapter(this, callLogs);  
  103.         callLogListView.setAdapter(adapter);  
  104.     }  
  105. }  


 

代码是最好的解释了,这里使用的几个重要的类,一个是Uri(进行查询的通用资源标志符),一个是AsyncQueryHandler(Android提供的异步操作数据库的类),这里我们调用它的startQuery方法来查询数据库,在它onQueryComplete方法中得到数据库返回的游标cousor,通过curor来取得数据库对应表中的字段值。

 

[java] view plaincopy技术分享技术分享
 
  1. <pre code_snippet_id="205549" snippet_file_name="blog_20140226_3_3338512"></pre>  
  2. <pre></pre>  
  3. <pre></pre>  

以上是关于为啥现在很多app进去都要查看我们通讯录,通话记录?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得手机后台应用每次都要重新进?

上传的数据在云端的怎么查看,保存在啥位置?

vivo手机如何登录Twitter

Android 极光IM-高级篇-玩聊天app诞生

为啥我需要 READ_CONTACTS 权限才能读取通话记录?

音视频实时交互/语音通话/即时通话/连麦,EasyRTC即时通讯系统全方位服务