如何获取并显示对话联系人的姓名和图像?

How to Fetch and Display Name and Image of Conversation's Contact?

我想实现如下截图所示的效果,到目前为止,我能够显示带有消息计数的最新消息列表,但是当我试图通过“地址”获取人名时,我出现错误“未找到列地址”。 请帮我显示“带头像的联系人姓名”。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {        
    View view = inflater.inflate(R.layout.MyChatFragment, container, false);
    
    // Inflate the layout for this fragment
    
    ListView lv = (ListView) view.findViewById(R.id.listView2);
     
    ArrayList<String> smsList;        
    smsList = new ArrayList<>();
    ArrayAdapter<String> lva = new ArrayAdapter<String>(getActivity(), 
    android.R.layout.simple_list_item_1, smsList);        
    lv.setAdapter(lva);

    Uri inboxUri = Uri.parse("content://sms/conversations/");
    ContentResolver contentResolver = getActivity().getContentResolver();
    Cursor cursor = contentResolver.query(inboxUri, null, null, null, null);

    if (cursor.moveToFirst()) {
            while (cursor.moveToNext()) {

        String number = cursor.getString(cursor.getColumnIndexOrThrow("address"));
        String message_count = cursor.getString(cursor.getColumnIndexOrThrow("msg_count"));
        String body = cursor.getString(cursor.getColumnIndexOrThrow("snippet"));
        smsList.add("Number: " + number + "\n" + "Message: " + body + "\n" + "Number Of Messages" + 
        message_count );

            }
        }
            return view;
     }

对话 uri 不包含像“地址”这样的列。您可以通过循环 cursor.getColumnName(index) 简单地查看特定 uri 中的所有列并将其打印到 logcat。您还可以在 docs 中找到特定 uri 的列列表。
基本上,Sms ContentProvider 不包含有关联系人的信息,因此您需要对 ContactsContract uri 进行第二次查询,并通过他的 phone 号码找到特定联系人。根据您需要的数据,有很多 uri。您可以使用 ContactsContract.PhoneLookup.CONTENT_FILTER_URI 简单地 link 来自与特定联系人的短信的 phone 号码。有关联系人的更多详细信息位于 ContactsContract ContentProvider 的子 uris 中。您可以在 docs 中找到所有这些的描述。
下面是简单的例子。联系人照片不像照片那样存储,而只是像照片的 uri,因此您必须通过 uri 获取图像。我没有测试该代码太久,所以我不能告诉你它是如何工作的,例如当你有几个相同号码的联系人时。

if (cursor.moveToFirst()) {
        while (cursor.moveToNext()) {
            String number = cursor.getString(cursor.getColumnIndexOrThrow("address"));
            String thread_id = cursor.getString(cursor.getColumnIndexOrThrow("thread_id"));
            String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
            String name = "";
            String photoUri = "";

            if (number != null) {
                Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number);
                String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup.PHOTO_URI};
                Cursor contactCursor = getContentResolver().query(uri, projection, null, null, null);
                if (contactCursor != null && contactCursor.getCount() > 0) {
                    if (contactCursor.moveToFirst()) {
                        do {
                            name = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
                            photoUri = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI));
                        } while (contactCursor.moveToNext());
                    }
                    contactCursor.close();
                }
            }
        }
    }
    cursor.close();

请注意,您需要获得 Manifest.permission.READ_CONTACTS 权限才能阅读有关联系人的信息。