如何以编程方式在android中查找单个联系人的所有号码?
我有一个应用程序,我想在点击项目时获取单个联系人的多个号码。 我有一个联系人列表视图,在该视图中,如果联系人有多个号码,我需要多个号码。 这是我的密码, 我得到了所有的数字,但不能点击得到多个数字 MainActivity.java如何以编程方式在android中查找单个联系人的所有号码?,android,android-contacts,Android,Android Contacts,我有一个应用程序,我想在点击项目时获取单个联系人的多个号码。 我有一个联系人列表视图,在该视图中,如果联系人有多个号码,我需要多个号码。 这是我的密码, 我得到了所有的数字,但不能点击得到多个数字 MainActivity.java ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
String phone = null;
String emailContact = null;
String emailType = null;
String image_uri = "";
Bitmap bitmap = null;
if (cur.getCount() > 0) {
while (cur.moveToNext())
{
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
image_uri = cur
.getString(cur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
System.out.println("name : " + name + ", ID : " + id);
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[]{id}, null);
while (pCur.moveToNext())
{
phone = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String phone1 = pCur
.getString(pCur
.getColumnIndex(String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)));
Log.e("PHONE",phone1);
System.out.println("phone" + phone);
}
pCur.close();
Cursor emailCur = cr.query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[]{id}, null);
while (emailCur.moveToNext())
{
emailContact = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)||
emailContact.equalsIgnoreCase("")){
emailContact="";
Log.e("isEmpty","isEmpty " + emailContact);
}else{
Log.e("gfdszfg","Email " + emailContact);
}
/* emailType = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/
Log.e("gfdszfg","Email " + emailContact);
}
emailCur.close();
}
if (image_uri != null) {
System.out.println(Uri.parse(image_uri));
try {
bitmap = MediaStore.Images.Media
.getBitmap(this.getContentResolver(),
Uri.parse(image_uri));
System.out.println(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mList.add(new Contacts(name, phone, image_uri,emailContact));
emailContact="";
}
cur.close();
mMyContactsAdapter = new MyContactsAdapter(MainActivity.this,
mList);
mcontact.setAdapter(mMyContactsAdapter);
}
}
似乎您正在正确地遍历每个联系人的所有电话,但当while循环结束时,
phone
仅指向您找到的最后一部电话
...
List<String> phonesList = new ArrayList<String>();
while (pCur.moveToNext()) {
phone = pCur.getString( ... Phone.NUMBER));
// add the phone to a growing list of phones
phonesList.add(phone);
}
pCur.close();
...
// Change 'Contacts' constructor to accept List<String>, rather then String for phone
mList.add(new Contacts(name, phonesList, image_uri,emailContact));
...
。。。
List phonesList=new ArrayList();
while(pCur.moveToNext()){
phone=pCur.getString(…phone.NUMBER));
//将手机添加到不断增长的手机列表中
电话列表。添加(电话);
}
pCur.close();
...
//将“联系人”构造函数更改为接受列表,而不是电话字符串
添加(新联系人(姓名、电话列表、图像uri、电子邮件联系人));
...
当然,你也可以对电子邮件做同样的处理,如果你也想要手机的标签,你需要一个配对列表:list
来保存成对的手机+标签
另一方面,通过查询联系人contract.Data.CONTENT\u URI
查找设备上所有的电子邮件和电话,将它们全部放入HashMap
,然后迭代所有联系人,并从HashMap
获取电子邮件和电话,可以显著提高该代码的性能。
这将使查询数量从
*2
减少到2
查看当我单击我的listview@Marmori时如何获得多个联系人号码如果您按照我上面的建议设置初始联系人列表,您将有一个“联系人”对象列表,每个对象都包含一个电话列表。因此,当单击某个项目时,您不需要从数据库中查询任何内容,只需从单击的“联系人”对象中获取电话列表即可