如何让用户从联系人中选择电话号码,然后获取该电话号码、名字和姓氏

3

我迄今所做的是:

当点击某个按钮时:

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;
        }
    }
}

我无法获取姓氏、名字等信息。 我无法获取所选电话号码。
正如标题中所说,我只想让用户单击某个按钮时打开联系人列表,当他选择特定联系人时,该联系人的电话号码列表将出现,然后当他选择一个号码时,方法onActivityResult将被调用,在那里我将“解析”电话号码、姓氏、名字等信息。

我建议你将代码拆分成较小的方法。一个大方法做所有事情是不好的实践。 - danihodovic
你是否遇到了异常?请发布logcat日志。需要更多信息。 - Greg Ennis
没有任何例外,问题就在于我做错了什么(可能是查询不正确...)。phones.moveToFirst()返回false,而cursorStructuredName.moveToFirst()也返回false。 - Android Fan
这是一个已解决的问题链接,允许用户从中选择联系人及其电话号码:https://dev59.com/n2445IYBdhLWcg3wLXWh。 这是一个关于如何获取姓氏和名字等信息的已解决问题链接:https://dev59.com/sW855IYBdhLWcg3wg0nC,但我需要两者,而我还没有成功。 - Android Fan
经过更多的研究,我尝试了下面的代码:http://paste.ofcode.org/33dtpsnzNQ5Cd5UCRBYKKUz 但是任何一个ID都不等于上面代码中的contactId。我检查了光标和cursorStructuredName中的显示名称,它们是相同的,那么如何通过联系人ID找到联系人的姓氏、名字等信息呢? - Android Fan
2个回答

1

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

下面的代码允许用户按下一个按钮,然后打开联系人应用程序,让用户选择一个联系人(只显示至少有一个电话号码的联系人)。 选择联系人后,会打开其所有号码的列表,让用户选择一个号码(并非所有设备都具有此选项,例如,在某些设备上,同一联系人会出现多次,每个号码一个)。 之后,调用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();
                }
            }
        }
    }
}   

0

我相信这个代码片段可以解决你的一些问题。它基本上接收一个电话号码并查询其联系人号码。我使用它将数据上传到服务器。至于电话号码,我从接收到的通话监听器中获取。

String[] projection = new String[]{
                                ContactsContract.PhoneLookup.DISPLAY_NAME};
                        Uri contacturi= Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneno));
                    ContentResolver cr = getContentResolver();      
Cursor crc= cr.query(contacturi, projection, null, null, null);
                    if(crc.moveToNext()){
                            name=crc.getString(crc.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
} else{ name ="未知"; }

你需要在crc游标上添加所有所需的字段,例如家庭、电子邮件和家庭等。希望这能给你一些启示 :-/


1
这不太好,它会返回显示名称,例如“Dr. Mike Junior Laufer Suffix ...”,而我只请求名字、姓氏和电话号码。谢谢你,但是我已经找到了解决方案,甚至在回答自己的问题时发布了它。 - Android Fan
好的,我只是提供这个作为见解..... 你需要根据自己的需求进行定制 :-) 。是的,你已经回答了自己的问题,哈哈 - Kevin Kaburu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接