如何让用户从联系人中选择一个电话号码,然后获得电话号码、给定的姓名和姓氏



到目前为止我所做的是:

当点击某个按钮时:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, CONTACT_PICKER_RESULT); 

然后:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {  
switch (requestCode) {  
case CONTACT_PICKER_RESULT:  
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
Cursor cursor = null;
Cursor cursorStructuredName = null;
try{    
cursor = getContentResolver().query(uri, null, null, null, null);      
boolean hasNext = cursor.moveToNext();
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String hasPhoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String phoneNumber = null;      
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
if (phones.moveToFirst()) {//does not get inside the if
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
phones.close();

// projection
String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.PREFIX,
ContactsContract.CommonDataKinds.StructuredName.SUFFIX};

String where = ContactsContract.Data.RAW_CONTACT_ID + " =?"; 
String[] whereParameters = new String[]{contactId};
//Request
cursorStructuredName = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);
String displayName = null;
String givenName = null;
String middleName = null;                           
String familyName = null;
String prefix = null;
String suffix = null;
hasNext = cursorStructuredName.moveToFirst();
if (cursorStructuredName != null && hasNext) {//does not get here because hasNext equals false
displayName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME)); 
givenName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
middleName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)); 
familyName = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
prefix = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX)); 
suffix = cursorStructuredName.getString(cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX)); 
}
} finally {
if (cursor != null) {
cursor.close();
}
if (cursorStructuredName != null) {
cursorStructuredName.close();
}
}
}
}
break;
}
}
}

我记不清姓、名等。我无法获取所选的电话号码。

正如我在标题中所说,我只想当用户点击某个按钮时,联系人列表就会打开,当他选择一个特定的联系人时,就会出现一个联系人电话号码列表,然后当他选择了一个号码时,就会调用方法onAtivityResult我会"解析"电话号码、姓氏、名字等

经过更多的研究,我解决了我的问题。

下一个代码允许用户按下一个按钮,然后打开联系人应用程序,让用户选择联系人(只显示至少有一个电话号码的联系人)。选择联系人后,会打开其所有号码的列表,用户可以选择其中一个(并非所有设备都有此选项,例如,在某些设备中,同一联系人会出现不止一次,每个电话号码一个)。之后调用方法onActivityResult(),然后(如果一切正常)我提取所选的电话号码、给定的姓名和(所选联系人的)姓氏:

@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, CONTACT_PICKER_RESULT);  
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {  
switch (requestCode) {  
case CONTACT_PICKER_RESULT:  
handleContactSelection(data);
break;
}
}
}
private void handleContactSelection(Intent data) {
if (data != null) {
Uri uri = data.getData();
if (uri != null) {
Cursor cursor = null;
Cursor nameCursor = null;
try {
cursor = getContentResolver().query(uri, new String[]{  
ContactsContract.CommonDataKinds.Phone.NUMBER,
CommonDataKinds.Phone.CONTACT_ID} ,                                
null, null, null);
String phoneNumber = null;                  
String contactId = null;
if (cursor != null && cursor.moveToFirst()) {
contactId = cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.CONTACT_ID));
phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));                               
}
String givenName = null;///first name.
String familyName = null;//last name.
String projection[] = new String[]{ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME};
String whereName = ContactsContract.Data.MIMETYPE + " = ? AND " + 
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?";
String[] whereNameParams = new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId};
nameCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
projection, whereName, whereNameParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
if(nameCursor != null && nameCursor.moveToNext()) {
givenName = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
familyName = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
}
doSomething(phoneNumber,givenName,familyName);
} finally {
if (cursor != null) {
cursor.close();
}
if(nameCursor != null){
nameCursor.close();
}
}
}
}
}   

我相信这个会解决您的一些问题。这基本上是接收一个电话号码并查询其联系号码。我用它将数据上传到服务器。至于电话号码,我是从接听电话的听众那里得到的。

String[]投影=新String[]{ContactsContract.PhoneLookup.DISPLAY_NAME};Uri-contacturi=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_Uri,Uri.encode(phoneno));ContentResolver cr=getContentResolver();游标crc=cr.query(contacturi,projection,null,null);if(crc.moveToNext()){name=crc.getString(crc.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_name));}其他{name="未知";}

您需要在crc游标上添加所有必需的字段。即家、电子邮件、家人。希望这能给你一些见解:-/

相关内容

最新更新