在开发应用中,经常要获取本地手机的通讯录,特别是sns相关类的应用。因为通讯录属于隐私,所以在开发过程中如果要获取通讯录应该征求用户的同意。
通讯录一般存在两个地方,一个是本地手机上,一个是存在sim卡上。
下面分别讨论一下怎样获取这两个地方的联系人。(在这里我只获取联系人name 和number)
android通过contentProvider将通讯录的数据暴露出来,所以只要有一个正确的URI就可以通过contentprovider获取到通讯录数据。
贴代码:
1 //取本机通讯录 2 public static HashMap<String, ContractInfo> getPhoneContracts(Context mContext){ 3 HashMap<String, ContractInfo> map = new HashMap<String, ContractInfo>(); 4 ContentResolver resolver = mContext.getContentResolver(); 5 // 获取手机联系人 6 Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,null, null, null, null); //传入正确的uri 7 if(phoneCursor!=null){ 8 while(phoneCursor.moveToNext()){ 9 int nameIndex = phoneCursor.getColumnIndex(Phone.DISPLAY_NAME); //获取联系人name 10 String name = phoneCursor.getString(nameIndex); 11 String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(Phone.NUMBER)); //获取联系人number 12 if(TextUtils.isEmpty(phoneNumber)){ 13 continue; 14 } 15 //以下是我自己的数据封装。 16 ContractInfo contractInfo = new ContractInfo(); 17 contractInfo.setName(name); 18 contractInfo.setPhoneNumber(getNumber(phoneNumber)); 19 contractInfo.setFrom(PHONE); 20 map.put(getNumber(phoneNumber), contractInfo); 21 } 22 phoneCursor.close(); 23 } 24 return map; 25 } 26 27 28 接下来看获取sim卡的方法,sim卡的uri有两种可能content://icc/adn与content://sim/adn (一般情况下是第一种) 29 public static HashMap<String, ContractInfo> getSimContracts(Context mContext){ 30 //读取SIM卡手机号,有两种可能:content://icc/adn与content://sim/adn 31 HashMap<String, ContractInfo> map = new HashMap<String, ContractInfo>(); 32 33 ContentResolver resolver = mContext.getContentResolver(); 34 Uri uri = Uri.parse("content://icc/adn"); 35 Cursor phoneCursor = resolver.query(uri,null, null, null, null); 36 if(phoneCursor!=null){ 37 while(phoneCursor.moveToNext()){ 38 String name = phoneCursor.getString(phoneCursor.getColumnIndex("name")); 39 String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex("number")); 40 if(TextUtils.isEmpty(phoneNumber)){ 41 continue; 42 } 43 //以下是我自己的数据封装。 44 ContractInfo contractInfo = new ContractInfo(); 45 contractInfo.setName(name); 46 contractInfo.setPhoneNumber(getNumber(phoneNumber)); 47 contractInfo.setFrom(SIM); 48 map.put(getNumber(phoneNumber), contractInfo); 49 } 50 phoneCursor.close(); 51 } 52 return map; 53 }