Android-获取手机通讯录的实战应用(含SIM卡中的联系人)

前言:
像获取SIM卡中的联系人问题,当时困扰了一两天,到处找资料,有的地方能找到只字片语,有的地方能提供一小段代码,但这些对一个初学者来说都是不够。。。我觉得初学者还是更喜欢拿来主义(我也一样 ),嘿嘿,一个运行的通的源码比什么都好~
其实后来这个功能实现后,其实感觉就是一层窗户纸,一捅破其实很简单,往往很多问题都是知者容易,未知者难如上擎天。。。
为后来人少走弯路,特献上处子原创实例讲解贴~

效果图:


正题:
本实例包含几下实际应用:
1. 获取手机通讯录(包括SIM卡中的联系人)
2. 几种Intent的传值应用
3. Adapter的自定义使用
4. AutoCompleteTextView应用
5. TextWatcher应用(带正则应用)
6. AsyncTask应用
7. 防止手机横屏时页面重新加载
8. 通讯录联系人按拼音重排序

(注:以下代码都是针对标题节选的关键代码,甚至有些不是同一文件中,详情请参考工程)
一.获取手机通讯录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
//从本机中取号
private void GetLocalContact(){
  //读取手机中手机号
  Cursor cursor = getContentResolver().query(People.CONTENT_URI, null,
    null, null, null);
  while (cursor.moveToNext()) {
   ContactInfo cci = new ContactInfo();
   //取得联系人名字
   int nameFieldColumnIndex = cursor.getColumnIndex(People.NAME);
   cci.contactName = cursor.getString(nameFieldColumnIndex);
   //取得电话号码
   int numberFieldColumnIndex = cursor.getColumnIndex(People.NUMBER);
   cci.userNumber = cursor.getString(numberFieldColumnIndex);
   cci.userNumber = GetNumber(cci.userNumber);
   cci.isChecked = false;
   if (IsUserNumber(cci.userNumber)) {
    if (!IsContain(contactList, cci.userNumber)) {
     if(IsAlreadyCheck(wNumStr, cci.userNumber)){
      cci.isChecked = true;
      numberStr += "," + cci.userNumber;
     }
     contactList.add(cci);
      //Log.i("umeng", "*********"+cci.userNumber);
    }
   }
  }
  cursor.close();
}
 
//从SIM卡中取号
private void GetSimContact(String add){
  //读取SIM卡手机号,有两种可能:content://icc/adn与content://sim/adn
  try {
   Intent intent = new Intent();
   intent.setData(Uri.parse(add));
   Uri uri = intent.getData();
   mCursor = getContentResolver().query(uri, null, null, null, null);
   if (mCursor != null) {
    while (mCursor.moveToNext()) {
     ContactInfo sci = new ContactInfo();
     // 取得联系人名字
     int nameFieldColumnIndex = mCursor.getColumnIndex("name");
     sci.contactName = mCursor.getString(nameFieldColumnIndex);
     // 取得电话号码
     int numberFieldColumnIndex = mCursor
       .getColumnIndex("number");
     sci.userNumber = mCursor.getString(numberFieldColumnIndex);
     sci.userNumber = GetNumber(sci.userNumber);
     sci.isChecked = false;
 
     if (IsUserNumber(sci.userNumber)) {
      if (!IsContain(contactList, sci.userNumber)) {
       if(IsAlreadyCheck(wNumStr, sci.userNumber)){
        sci.isChecked = true;
        numberStr += "," + sci.userNumber;
       }
       contactList.add(sci);
        //Log.i("umeng", "*********"+sci.userNumber);
      }
     }
    }
    mCursor.close();
   }
  } catch (Exception e) {
   Log.i("umeng", e.toString());
  }
}

二. 几种Intent的传值应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//页面传值并获取回传值
Intent intent = new Intent();
intent.setClass(Eoe_Contact.this, ContactListView.class);
Bundle bundle = new Bundle();
String wNumberStr = eMsisdn.getText().toString();
bundle.putString("wNumberStr", wNumberStr);
intent.putExtras(bundle);
startActivityForResult(intent, CONTACT_REQUEST_CODE);
 
//获取前一页面所传值
  Intent intent = this.getIntent();
  Bundle  bundle = intent.getExtras();
  String wNumberStr = bundle.getString("wNumberStr").replace(",", ",");
 
//获取回传值
//重写获取页面回传值
    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     switch (requestCode) {
     case CONTACT_REQUEST_CODE:
   if (resultCode == RESULT_OK) {
    String numberStr = null;
    Bundle bundle = data.getExtras();
    if (bundle != null) {
     numberStr = bundle.getString("numberStr");
    }
    eMsisdn.setText(numberStr);
   }
   break;
  }
    }

三. Adapter的自定义使用
继承BaseAdapter类,重写。这个内容比较多就不粘了,详情看ContactAdapter.JAVA页面
需要注意的一点是,getView方法,adapter是在页面变化的时候,重新获取当前页面的数据

四. AutoCompleteTextView应用 和 TextWatcher应用
大家都看过APIDEMOS的示例,看过AutoCompleteTextView的基本应用,但是实际当中那些是不够的,我们往往希望点击自动提示后对所获取的内容做自己的逻辑处理,因此TextWatcher可以派上用场了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//编辑AUTOCOMPLETE数组
    autoContact = new String[contactList.size()];
    for(int c=0;c<contactList.size();c++){
     autoContact[c]=contactList.get(c).contactName+"("+contactList.get(c).userNumber+")";
    }
    //绑定AUTOCOMPLETE
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(ContactListView.this,
                  android.R.layout.simple_dropdown_item_1line, autoContact);
    textView.setAdapter(adapter);
    textView.addTextChangedListener(mTextWatcher);
 
//监听AUTOTEXT内容变化,当出现符合选中联系人[联系人(手机号)]的情况下,将该勾中,并加入选中手机号中
private TextWatcher mTextWatcher = new TextWatcher() {
  public void beforeTextChanged(CharSequence s, int start, int
                before, int after) { }
        public void onTextChanged(CharSequence s, int start,
                int before, int after) {
                 String autoText = s.toString();
         if(autoText.length()>=13){
          Pattern pt=Pattern.compile("\\(([1][3,5,8]+\\d{9})\\)");
          Matcher mc = pt.matcher(autoText);
          if(mc.find()){
           String sNumber = mc.group(1);
           DealWithAutoComplete(contactList,sNumber);
           //刷新列表
           Toast.makeText(ContactListView.this, "已选中您搜索的结果!",1000).show();
           ca.setItemList(contactList);
           ca.notifyDataSetChanged();
          }
         }
        }
        public void afterTextChanged(Editable s) { }
};

五. AsyncTask应用
考虑到从机子上获取通讯有时间等待,因此使用了进程,提高体验效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//启动进程
  new GetContactTask().execute("");
 
//获取通讯录进程
private class GetContactTask extends AsyncTask<String, String, String> {
  public String doInBackground(String... params) {
 
   return "";
  }
  @Override
  protected void onPreExecute() {
   showDialog(DIALOG_KEY);
  }
  @Override
  public void onPostExecute(String Re) {
 
          removeDialog(DIALOG_KEY);
  }
 
  //下面这段本例未使用,能配合doInBackground进行刷新效果
  @Override
  protected void onProgressUpdate(String... values) {
   // TODO Auto-generated method stub
  }
}
//

六. 防止手机横屏时页面重新加载
AndroidManifest.xml中:

 

七. 通讯录联系人按拼音重排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//按中文拼音顺序排序
    Comparator comp = new Mycomparator(); 
    Collections.sort(contactList,comp);
 
//通讯社按中文拼音排序
public class Mycomparator implements Comparator{ 
public int compare(Object o1,Object o2) { 
ContactInfo c1=(ContactInfo)o1; 
ContactInfo c2=(ContactInfo)o2; 
Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
return cmp.compare(c1.contactName, c2.contactName); 
} 
 
}

呃,应该都差不多这些了。。。

后记:
发现ANDROID 2.0以后提供了一个新的类,android.provider.ContactsContract,貌似可以直接取出SIM卡中的联系人。
以前代码都是使用ANDROID 1.5,毕竟需要考虑到一些低版本用户吧~

android2.2应用开发之IccCard(sim卡或USIM卡)第一篇 <br />     如果要做android通讯录的联系人的机卡混排显示,由于手机卡类型的不同,导致手机卡存储容量以及可以存储信息不同,就要涉及到android去读Icc卡的信息。<br />      一般的sim卡只能存储姓名跟一个电话号码,而USIM卡还可以存多个电话号码跟邮箱,所以编辑卡上联系人的时候应该动态的去布局,或者应用可以去写死,让USIM卡的存储信息与SIM卡一致。<br />     由于本人是在源码上开发的,用SDK开发的朋友有些类或方法以及属性可能引用不到,这是由于用的谷歌没有公开的 阅读详情

相关推荐

Android获取通讯录及SIM卡联系人实战指南.zip

本文还有配套的精品资源,点击获取 简介:本实战应用详细讲解了如何在Android平台上获取和整合手机和SIM卡中的联系人数据。内容包括权限配置、通过ContentProvider和Cursor实现联系人查询、读取SIM卡联系人数据,并讨论了兼容性处理、用户许可、性能优化和数据安全等问题。通过学习这些技巧,开发者可以构建一个功能完整的通讯录管理应用。 1. 权限配置...

weixin_35879493的博客 1506

2023 夜聊远程获取通讯录APP/相册/短信/双端源码

2023 夜聊远程获取通讯录APP/相册/短信/双端源码2023 夜聊远程获取通讯录APP/相册/短信/双端源码2023 夜聊远程获取通讯录APP/相册/短信/双端源码2023 夜聊远程获取通讯录APP/相册/短信/双端源码2023 夜聊远程获取通讯录APP/相册/短信/双端源码2023 夜聊远程获取通讯录APP/相册/短信/双端源码。http://改为自己ip访问/admin/默认账号 密码 admin 123456。宝塔站点伪静态设置为tphinkphp。请勿违法使用,仅供学习。PHP版本选择5.6。

2374

Android开发实战:获取手机及SIM卡联系人完整源码解析

随着移动互联网的快速发展,通讯录作为Android系统中最基础且高频使用的功能之一,已成为各类应用中不可或缺的模块。从社交、即时通讯到企业办公应用,都离不开对联系人数据的访问与整合。从系统架构角度看,Android通过Content Provider机制统一管理联系人数据,确保了数据的安全性与可共享性。这使得开发者能够在遵循权限规范的前提下,灵活读取、展示甚至修改联系人信息。

weixin_36303305的博客 924

CH6-内容提供者

文章目录目标一、内容提供者概述目标数据模型Uri二、创建内容提供者目标创建内容提供者的步骤三、访问其他应用程序目标3.1 查询其他程序数据3.2 UriMatcher类3.3 实战演练—读取手机通讯录四、内容观察者目标4.1 什么是内容观察者**1.** **创建内容观察者****2.** **注册内容观察者****3. 取消内容观察者**4.2 实战演练—监测数据变化 目标 掌握内容提供者的创建方式,能够独立完成创建内容提供者 掌握使用内容提供者访问其他应用程序的步骤,能够实现读取手机通讯录的功能 掌握

weixin_46227276的博客 6984

读取通讯录短信定位信息APP源码.zip

读取通讯录短信定位信息APP源码,仅供学习研究禁止非法用途!

获取手机通讯录的实战应用(含SIM卡中的联系人).zip

获取手机通讯录的实战应用(含SIM卡中的联系人).zip

Android Studio初学者实例:ContentProvider读取手机通讯录

其次是RecyclerView的item布局代码,其中使用了CardView是为了方便快捷的弄个圆角储来。知识点包含了RecyclerView控件、UriMatcher、ContentResolver。该实验是通过ContentProvider读取手机通讯录。先看效果,显示手机通讯录。首先是界面的布局代码。

林大大的博客 7452

安卓Android源码——获取手机通讯录的实战应用(含SIM卡中的联系人).zip

安卓Android源码——获取手机通讯录的实战应用(含SIM卡中的联系人).zip

【进阶C语言】静态版通讯录的实现(详细讲解+全部源码)

静态版通讯录的实现(详细讲解+全部源码),内含各种程序过程详细介绍

m0_75058342的博客 2万+

Android 获取通讯录程序源码.zip

Android 获取通讯录程序源码.zip

获取通讯录数据(iPhone源代码)

来源:Licence:Custom作者:人生     实现通讯录的各种操作,包括获取通讯录数据,添加新的联系人,调用系统短信功能发短信等等。短信功能仅能在真机中测试。     小编注:感谢开发者@人生 。

闪聊远程获取通讯录PHP源码

接着,在app/database.php中配置好数据库路径。最后,在宝塔面板的站点管理中,将伪静态设置为tphinkphp即可。闪聊远程获取通讯录PHP,首先你需要在服务器上搭建Nginx+mysql5.6+php5.6+phpMyAdmin的环境。请勿违法使用,仅供研究学习,转载未测试,有需要的小伙伴可以自行下载研究。这样一来,你就可以轻松搭建闪聊通讯录的PHP源码了。

youxi213的博客 943

树莓派Bookworm系统避坑指南:3种方法解决pip install报错externally-managed-environment

本文详细解析树莓派Bookworm系统中pip install报错externally-managed-environment的成因,并提供三种实用解决方案:使用虚拟环境(venv)隔离项目依赖、通过pipx管理全局Python工具,以及理解风险后的系统安装方法。帮助开发者安全高效地管理Python环境,避免系统冲突。

android的专栏 763

手机通讯录大营救,恢复sim卡联系人的3个重要方法

或许你曾经历过这样的困境:一觉醒来,发现手机通讯录空空如也!恢复sim卡联系人的方法有哪些呢?今天,我们将为你揭示3个重要的技巧,为你提供有力的帮助,让你的通讯录重新焕发生机!

shu_ju_wa的博客 3196

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 222

手把手教你用OpenClaw+飞书打造论文写作AI助手(附踩坑实录)

面对几十篇文献,逐一阅读摘要都费时。我:“请提取桌面‘论文参考文献’文件夹中所有PDF的摘要,整理成表格,包含:论文标题、作者、发表年份、核心方法、主要结论。AI助手:“正在处理...已提取18篇论文摘要,汇总表格已保存到桌面‘文献摘要汇总.xlsx’。这比我自己一个个打开PDF复制粘贴快了不止100倍。OpenClaw+飞书的组合,让AI真正成为了我的“数字员工”。虽然配置过程有些曲折,但看到它在飞书里回应指令、帮我处理繁琐工作时,那种成就感无可替代。如果你也在准备论文,不妨试试这套方案。记住,

AcademicIdeas的博客 1041

如何将Android手机上的联系人复制到SIM卡上? (简单有效)

无论您是更换了新的Android手机还是SIM卡,本文提供的方法都能帮助您将联系人从Android手机复制到SIM卡。此外,Coolmuster Android Assistant还允许您在计算机上快速管理联系人和其他数据,例如添加新联系人、创建联系人组、导入、导出、编辑和删除联系人。您可以使用手机上的通讯录应用程序将联系人复制到SIM卡,这样您就可以在Android手机上进行编辑、添加、导入、导出和共享联系人,无需安装额外的应用程序。将联系人从Android手机导出到SIM卡的另一种方法是通过本地备份。

Coolmuster的博客 5495

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 515

如何将Android手机上的联系人复制到SIM卡上?

联系人是我们智能手机上的重要信息,可以保存在Android内存和 SIM 卡中。如今, Android手机的整体性能和通讯技术都在快速升级,导致很多人更换手机的频率比以前更高。如果你将联系人存储在SIM卡中,当你换新手机时,事情就会变得容易得多。但如果您将联系人存储在Android内存中,您仍然可以将其导出到 SIM 卡。这篇文章深入探讨了如何将Android手机中的联系人复制到 SIM 卡的问题,并为您提供最新的解决方案。第 1 部分:在将手机联系人复制到 SIM 卡之前管理Android联系人。

TheNextByte1的博客 1053

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真

本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。

amy_mhd的博客 85

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1401

手机联系人删除了怎么找回?3个秘籍,恢复安卓手机通讯录

我们经常依赖手机来管理和存储重要的联系人信息,但也困扰于联系人删除了怎么找回。面对这样的困境,有3种有效的方法可以帮你恢复。点击文章查看,一起找回通讯录!

2401_87304298的博客 3068

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 366

手机拯救计划:掌握3个技巧,轻松找回通讯录联系人号码

手机通讯录承载着个人社交网络的基石,无论是误操作还是系统故障,一旦丢失就可能导致严重的后果。因此,找回通讯录联系人号码是我们需要掌握的技能。本文将详细介绍3种专业的技巧,让你不再为数据丢失而烦恼。

shu_ju_wa的博客 1552

OmniDrive(3):逐行代码详解

模型效果: 端到端联合规划与推理 接下来,简单介绍下训练的配置 1.1 模型配置 模型基于sparse query based的3D Bev感知框架StreamPetr ,用query来编码动态目标(如车辆、行人)和静态地图元素(如车道线)。(1) tran、test和val数据配置 指定真值的文件路径: ann_file 指定输出处理的pipeline: 训练使用, test 和val使用 指定是否需要时序训练seq_mode (2)数据处理pipeline 自定义的Dataset 通过类实现,训

@bangbang的博客 719

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android软件开发之获取通讯录联系人信息 + android联系人信息的存储结构 + Android联系人读取操作笔记

总结的最好的一篇文章是: http://blog.youkuaiyun.com/xys289187120/article/details/6730957 但要纠错下: Contacts表中没有display_name字段,后者应该是在raw_contacts表中的 -----------------------------------------------------------------

snwrking的专栏 6万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Cursor类
下一篇: Android 中关于 【Cursor】 类的介绍
whatsyourname
博客等级 码龄23年 13粉丝 326原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值