
在Android开发中,我经常会遇到需要获取手机通讯录联系人信息,Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息获取出来。
下面直接贴出代码供大家参考:
程序文件java代码:
import javaioInputStream;
import javautilArrayList;
import androidappListActivity;
import androidcontentContentResolver;
import androidcontentContentUris;
import androidcontentContext;
import androidcontentIntent;
import androiddatabaseCursor;
import androidgraphicsBitmap;
import androidgraphicsBitmapFactory;
import androidnetUri;
import androidosBundle;
import androidproviderContactsContract;
import androidproviderContactsContractCommonDataKindsPhone;
import androidproviderContactsContractCommonDataKindsPhoto;
import androidtextTextUtils;
import androidviewLayoutInflater;
import androidviewView;
import androidviewViewGroup;
import androidwidgetAdapterView;
import androidwidgetBaseAdapter;
import androidwidgetImageView;
import androidwidgetListView;
import androidwidgetTextView;
import androidwidgetAdapterViewOnItemClickListener;
public class ContactsActivity extends ListActivity {
Context mContext = null;
/获取库Phon表字段/
private static final String[] PHONES_PROJECTION = new String[] {
PhoneDISPLAY_NAME, PhoneNUMBER, PhotoPHOTO_ID,PhoneCONTACT_ID };
/联系人显示名称/
private static final int PHONES_DISPLAY_NAME_INDEX = 0;
/电话号码/
private static final int PHONES_NUMBER_INDEX = 1;
/头像ID/
private static final int PHONES_PHOTO_ID_INDEX = 2;
/联系人的ID/
private static final int PHONES_CONTACT_ID_INDEX = 3;
/联系人名称/
private ArrayList<String> mContactsName = new ArrayList<String>();
/联系人头像/
private ArrayList<String> mContactsNumber = new ArrayList<String>();
/联系人头像/
private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();
ListView mListView = null;
MyListAdapter myAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = this;
mListView = thisgetListView();
/得到手机通讯录联系人信息/
getPhoneContacts();
myAdapter = new MyListAdapter(this);
setListAdapter(myAdapter);
mListViewsetOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<> adapterView, View view,
int position, long id) {
//调用系统方法拨打电话
Intent dialIntent = new Intent(IntentACTION_CALL, Uri
parse("tel:" + mContactsNumberget(position)));
startActivity(dialIntent);
}
});
superonCreate(savedInstanceState);
}
/得到手机通讯录联系人信息/
private void getPhoneContacts() {
ContentResolver resolver = mContextgetContentResolver();
// 获取手机联系人
Cursor phoneCursor = resolverquery(PhoneCONTENT_URI,PHONES_PROJECTION, null, null, null);
if (phoneCursor != null) {
while (phoneCursormoveToNext()) {
//得到手机号码
String phoneNumber = phoneCursorgetString(PHONES_NUMBER_INDEX);
//当手机号码为空的或者为空字段 跳过当前循环
if (TextUtilsisEmpty(phoneNumber))
continue;
//得到联系人名称
String contactName = phoneCursorgetString(PHONES_DISPLAY_NAME_INDEX);
//得到联系人ID
Long contactid = phoneCursorgetLong(PHONES_CONTACT_ID_INDEX);
//得到联系人头像ID
Long photoid = phoneCursorgetLong(PHONES_PHOTO_ID_INDEX);
//得到联系人头像Bitamp
Bitmap contactPhoto = null;
//photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
if(photoid > 0 ) {
Uri uri =ContentUriswithAppendedId(ContactsContractContactsCONTENT_URI,contactid);
InputStream input = ContactsContractContactsopenContactPhotoInputStream(resolver, uri);
contactPhoto = BitmapFactorydecodeStream(input);
}else {
contactPhoto = BitmapFactorydecodeResource(getResources(), Rdrawablecontact_photo);
}
mContactsNameadd(contactName);
mContactsNumberadd(phoneNumber);
mContactsPhontoadd(contactPhoto);
}
phoneCursorclose();
}
}
/得到手机SIM卡联系人人信息/
private void getSIMContacts() {
ContentResolver resolver = mContextgetContentResolver();
// 获取Sims卡联系人
Uri uri = Uriparse("content://icc/adn");
Cursor phoneCursor = resolverquery(uri, PHONES_PROJECTION, null, null,
null);
if (phoneCursor != null) {
while (phoneCursormoveToNext()) {
// 得到手机号码
String phoneNumber = phoneCursorgetString(PHONES_NUMBER_INDEX);
// 当手机号码为空的或者为空字段 跳过当前循环
if (TextUtilsisEmpty(phoneNumber))
continue;
// 得到联系人名称
String contactName = phoneCursor
getString(PHONES_DISPLAY_NAME_INDEX);
//Sim卡中没有联系人头像
mContactsNameadd(contactName);
mContactsNumberadd(phoneNumber);
}
phoneCursorclose();
}
}
class MyListAdapter extends BaseAdapter {
public MyListAdapter(Context context) {
mContext = context;
}
public int getCount() {
//设置绘制数量
return mContactsNamesize();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iamge = null;
TextView title = null;
TextView text = null;
if (convertView == null) {
convertView = LayoutInflaterfrom(mContext)inflate(
Rlayoutcolorlist, null);
iamge = (ImageView) convertViewfindViewById(Ridcolor_image);
title = (TextView) convertViewfindViewById(Ridcolor_title);
text = (TextView) convertViewfindViewById(Ridcolor_text);
}
//绘制联系人名称
titlesetText(mContactsNameget(position));
//绘制联系人号码
textsetText(mContactsNumberget(position));
//绘制联系人头像
iamgesetImageBitmap(mContactsPhontoget(position));
return convertView;
}
}
}
1 Android 渠道追踪方法
众所周知 Google Play 无法在中国使用,所以国内 Android 市场被数十家应用商店( 豌豆荚、百度助手、酷市场、360手机助手等等 )占领,Android 渠道追踪主要围绕上述渠道展开。
方法 1:每个渠道打渠道包
具体来说就是开发者为每一个渠道生成一个渠道安装包,不同渠道包用不同的 Channel ID (渠道标识)来标识;当用户下载了 App 之后,运营人员就可以通过渠道标识查看各个渠道的数据。
Android 渠道打包机制:
虽然这样可以统计到不同渠道的来源数据,但是当渠道数量变多、抑或同一渠道在多个平台上做推广的话,打渠道包的做法就捉襟见肘了。
方法 2:使用平台方提供的数据
部分第三方推广平台提供渠道数据,然而只依赖平台方的「一面之词」是很难找到真正的优质渠道。
2 iOS 渠道追踪方法
和 Android 的开放生态不一样,iOS 则是一个完全封闭的系统;除了少部分越狱机器,绝大部分 App 都是从 App Store 中下载。在苹果一家独大以及严格的审核制度下,Android 打包的做法在这里就完全行不通。
为了追踪 iOS 渠道数据,开发者们想出了很多黑科技,下面我介绍一下常见的三种做法。
方法 1:通过 IDFA 追踪渠道
IDFA 的全称是 Identifier for Advertisers ,即广告标识符的含义,这是苹果专门给各广告提供商用来追踪用户而设的标识。
通过 IDFA 追踪渠道:
今日头条作为广告提供商可以获取用户的 IDFA,当你在上面投放的 App 被用户下载激活,你的 App 也可以获取用户的 IDFA。将广告提供商提供的 IDFA 和自己获取的 IDFA 匹配,即可追踪渠道来源。
缺点是 IDFA 只能用于 App 类型的渠道,如果你在网页上投放广告是不支持的;同时,用户可以在iPhone 设置中选择关掉 IDFA 获取权限。
方法 2:通过 Cookie 追踪渠道
iOS 9 里面引入了 SFSafariViewController 类,一方面是用户体验更好了,同时可跨 App 与 Safari 共享 Cookie。
通过 Cookie 追踪渠道:
当用户点击广告链接时,监控服务器可以接收到 Cookie 中含有的渠道信息;用户在 App Store 中下载激活 App,这个时候监控服务器再次收到 Cookie 信息。系统匹配前后两次 Cookie ,即可追踪渠道。
缺点是基于SFSafariViewController 的追踪必须在 iOS 9 及以上版本才有效,而且微信公众号广告、朋友圈广告仍然无法实现追踪。
上述方法可以实现部分平台、部分渠道的追踪监测,然而三大缺点也是显而易见:
(1)割裂了 Android 和 iOS 两个平台的渠道数据,难以整合分析;
(2)Android 投放需要重复打包,效率低下;
(3)iOS 渠道范围限制多,无法大规模推广。
Part 2 | 基于用户设备标记的解决方案
下面我们介绍一种快速、灵活的解决方案 ––– 基于用户设备标识的追踪方法,它可以同时兼容 Android 和 iOS 两个平台、适用于大部分投放渠道。
1 基于用户设备标记的追踪原理
上面介绍的基于 IDFA 和 SFSafariViewController 的两种方法均受到 iOS 的限制,而用户的设备标记则不受系统的影响。在 GrowingIO渠道来源解决方案中,我们将「IP + UserAgent + 设备 ID」组合设置为用户的设备标记。
通过用户设备标记追踪渠道:
用户点击含有 UTM 追踪参数的广告链接后,GrowingIO 服务器检测到用户的设备标记以及 UTM 渠道参数。链接跳转到应用商店( Android 和 iOS 均可以)后,用户下载安装并激活 App,此时 GrowingIO 服务器第二次收到用户的设备标记。
系统匹配前后两次的标记,可以确定用户的渠道来源,同时 UTM 参数含有的详细渠道信息一并呈现。
2 用户设备标记方法的特点
当然,基于用户设备标记的方法也有一定不足。当小部分用户所处的网络环境前后变化时(如从 WiFi 切换到 4G),此时 IP 前后不一致就会导致匹配失败。
但是相比于前面的 4 种方法,基于用户设备标记的渠道追踪方法显然更有优势:
第一点,打通了 iOS 和 Android 的渠道来源,可以将 *** 作系统加入用户属性整合分析;
第二点:避免了 Android 平台重复打渠道包的工作;
第三点:规避了 iOS 原有诸多限制,适用于更加广泛的推广渠道;
第四点:只需修改推广链接中的参数、无需改动安装包,适合大规模、多渠道、敏捷的推广需求。
同时,广告链接中含有的渠道参数( 广告来源、广告媒介、广告名称、广告内容、广告关键字 )可以一同加入用户属性数据中,方便后期对用户数据进行多维度的对比、交叉分析。
Part 3 | App 渠道数据分析两大思路
有了 App 渠道追踪数据后,我们可以将 UTM 的五个参数作为维度,从数量和质量两个思路出发,进行 App 渠道数据分析。
1 数量:找到获客成本最低的渠道
根据业务需要,我们选取广告来源( utm_source )和广告关键词 ( utm_term ) 两个维度,计算出不同渠道的获客数量并评估获客成本。
某 O2O 类 App 先后在 3 个渠道上进行了 2 次投放,投放内容先后是「美食」和「外卖」。通过 UTM,我们监测到每个渠道、每次投放的 「App 新增用户量」,然后计算出平均获客成本。
从广告来源上看,渠道 1 的平均获客成本最低;从广告关键词上看,「外卖」主题的广告平均获客成本最低。从客单价的角度出发,接下来可以针对性优化投放渠道和投放内容,大幅度降低投放成本、提高拉新效率。
2 质量:找到获客价值最高的渠道
「App 新增激活用户量」和「获客成本」这两个指标是从数量的角度进行分析,但是数量大、价格低并不一定代表渠道用户质量高。我们还需综合考虑用新用户在接下来的表现,以及新用户所能带来的价值。
方法 1:用户行为数据分析
在这个过程中,我们重点参考用户留存指标,包括次日留存率、三日留存率、七日留存率、三十日留存率等等。
我们按访问来源(utm_source)分析新用户的留存度,发现渠道 2 的三十日留存率高达 14%,而渠道 1 为 8%、渠道 3 为 6%。从留存度上来看,渠道 2 获取的新用户价值显著更高。
方法2:用户价值分析
除了用户行为指标,财务指标也非常具有参考性。按照广告来源(utm_source)我们统计出不同渠道获取到的新用户的财务价值,如新用户在第一个月的月付费率(MPR)和用户平均收益(ARPU)。
通过分析发现,渠道 2 获取的新用户首月付费率(42%)最高,用户平均收益(30 元)也是最高的。虽然渠道 2 的获客成本略高于渠道 1,但是从收益的角度来说,投资渠道 2 显然是一种更加明智的选择。
综合上述指标,该 O2O 类 App 在下个月的市场投放中将资源集中到了渠道 2,同时主打「外卖」主题内容。还是和上个月同样的市场预算,但是新增用户却提高了 150%、新用户留存率提升了 240%,这是一个巨大的增长。
IDC最近一份关于移动应用开发的调查报告显示,Androdid开发者对谷歌的移动 *** 作系统平台的兴趣正在下降。尽管依然有79%的开发者表示对Android“非常感兴趣”,但IDC的调查报告显示,一些迹象表明在2012到2013年间,Android将随着遇到的问题,市场份额会出现大的变化。解决这些问题,对于谷歌如何维持Android生态系统的活力来说意义重大。同样,独立开发者也要意识到这些问题将给自己的商业计划带来困难。
1、Android的碎裂化问题
现如今,用户手中的Android系统版本各异。相信你已经看到过有很多关于开发者如何为最低通用版本编码的文章(现在可能是23版本了)。但是,不止在 *** 作系统方面存在Android版本碎裂化这个问题。在SDK开发工具上,也没有统一的标准。你可能要为六种尺寸的屏幕编码,不同的按钮、键盘,有的可能根本就没有按钮好吧,你可以在一个代码分支上为所有的这些设备编码(这种方案即笨拙又不容易实现),或者开发多个版本(听起来就很糟糕)。当然,如果回报还不错的话,这么做也未尝不可,可事实上并非如此。
2、投资的回报
这似乎是既定的法则:Android应用的利润一般都比iOS应用的利润少。这可能是因为人们在买手机时更关注它的功能而不是应用的质量,但是这意味着开发者将获得较少的利润。如果开发者拥有的时间和资源有限,在需要选择平台时,平台已经建立的基础将变得不再重要,他们更关心的将会只是:“我能否赚到钱”
3、克隆应用的数量
让我们先假设你有一款优秀的应用,它能做一些与众不同的工作,可能是能够联机到社交网络上、处理PIM数据,或者能提供一种新的游戏玩法。然后你有办法让你的应用从成千上万个应用里脱颖而出。但是,接下来就会有数不清的开发者开发出克隆版本,从而拉低你的应用的价格,和你展开竞争。Android商店几乎是一个无法无天的社会。如果不解决这一问题,让开发者面对不公平的竞争,还有多少开发者愿意在里面做应用推广呢
4、选择哪家商店销售你的应用
GooglePlay商店、亚马逊的Android商店、BarnesandNoble’sNookApps有很多地方你可以选择用来销售你的应用。这是市场方面的碎裂化问题,而且,有时候它也会让设备型号变得纷乱繁杂。这就意味着要建立更多的版本、协议等等,这些都会是令你头痛的工作。与此相反的是,iOS和Windows手机就没有这么多繁杂的工作要做。
像EA和Ubisoft这样的公司或许可以应付这些问题,但是那些个人开发者是不可能把他们所有的时间都花在应用商店的管理上的。有时候,电脑培训认为当平台已经不再处于快速发展阶段时,开放和免费并不是做好的选择。
下面介绍三种获取网页数据的代码
例子来自于android学习手册,android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳
//第一种
/获取参数(ArrayList<NameValuePair> nameValuePairs,String url)后post给远程服务器
将获得的返回结果(String)返回给调用者
本函数适用于查询数量较少的时候
/
public String posturl(ArrayList<NameValuePair> nameValuePairs,String url){
String result = "";
String tmp= "";
InputStream is = null;
try{
>
android如何设计加载库。设计一张时要注意:1不要选择过多的图像文件,选择不同的应该保证的清晰度,尽量保证中没有多余的信息。2使用高质量的,减少文字说明。尽量采用高质量的,以保证的清晰度,同时保证在网上和现实生活中的完美效果。3选择适当的纹理,适当的纹理也能给画册增添光彩,从而增加的色彩。的数量不应超过500张,应合理使用的形式。应尽量使用矢量图,它们是能放大缩小和增加色彩效果的好选择。3在画册设计,避免使用特效,如使用黑白。这个规则在设计过程中最终理解到位,将使宣传画册设计看上上述规则。4宣传册设计独特新颖的印刷技术对设计的最终结果起着重要的作用。
Adapter有一个方法 getCount() , 获取item的总数量,而position是从0开始数的,所以最后一个item的position应该是 adaptergetCount()-1
以上就是关于android开发怎样获取通讯录联系人信息全部的内容,包括:android开发怎样获取通讯录联系人信息、App页面上的数据如何追踪和统计的现成的工具有哪些、电脑培训分享android程序员必须要面对的几个问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)