Android 在我的应用程序中使用默认联系人选取器照片

Android 在我的应用程序中使用默认联系人选取器照片,android,contacts,Android,Contacts,在我的应用程序中,我有一个包含基本信息(姓名、电话号码)和联系人图像的联系人列表视图,非常类似于默认的Android联系人选择器。如果联系人没有图像,则会在其位置显示应用程序图标。但是,我希望使用联系人选取器使用的默认轮廓图像。我的问题是如何访问此图像并在我的应用程序中使用它?以下是我加载联系人图像的代码部分: Contact c = new Contact(); final String[] projection = new String[] { Contacts.D

在我的应用程序中,我有一个包含基本信息(姓名、电话号码)和联系人图像的联系人列表视图,非常类似于默认的Android联系人选择器。如果联系人没有图像,则会在其位置显示应用程序图标。但是,我希望使用联系人选取器使用的默认轮廓图像。我的问题是如何访问此图像并在我的应用程序中使用它?以下是我加载联系人图像的代码部分:

Contact c = new Contact();

    final String[] projection = new String[] {
        Contacts.DISPLAY_NAME, // the name of the contact
        Contacts.PHOTO_ID // the ID of the column in the data table for the image
    };


    final Cursor contact = getContentResolver().query(
        Contacts.CONTENT_URI,
        projection,
        Contacts._ID + "=?", // filter entries on the basis of the contact id
        new String[] {String.valueOf(contactId)}, // the parameter which the contact id column is compared to
        null
    );

    if(contact.moveToFirst()) {
        final String name = contact.getString(
                contact.getColumnIndex(Contacts.DISPLAY_NAME));
        final String photoId = contact.getString(
                contact.getColumnIndex(Contacts.PHOTO_ID));

        // Get photo data for this contact
        if(photoId != null) {
            final Cursor photo = managedQuery(
                Data.CONTENT_URI,
                new String[] {Photo.PHOTO}, // column for the photo blob
                Data._ID + "=?", // select row by id
                new String[] {photoId}, // filter by photoId
                null
            );

            // Convert photo blob to a bitmap
            if(photo.moveToFirst()) {
                byte[] photoBlob = photo.getBlob(
                        photo.getColumnIndex(Photo.PHOTO));
                final Bitmap photoBitmap = 
                    BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);

                c.setPhoto(photoBitmap);
            }


        }



        c.setName(name);
以下是my ContactAdapter类中的代码,该类将ImageView与contacts照片相关联:

ImageView photo = (ImageView) v.findViewById(R.id.contact_photo);

if(photo != null) {
            if(c.hasPhoto()) photo.setImageBitmap(c.getPhoto());
            else photo.setImageResource(R.drawable.app_icon);
        }

Android中实际上使用了3种不同的图像。您可以在emulator附带的资源的drawable文件夹中找到它们,也可以从此处下载它们:


Android中实际使用了3种不同的图像。您可以在emulator附带的资源的drawable文件夹中找到它们,也可以从此处下载它们:


太好了,谢谢!我要找的是蜂窝型的,它只是一个人的轮廓。我在android-11参考资料文件夹中找到了它。如果谷歌能够直接从SDK中公开这些图片,而不是我们需要在本地包含它们,那将是多么美好啊。。。这样,我们的应用程序将始终与当前的外观保持同步。@eidylon虽然这样做很好,但这正是谷歌不这么做的原因(这是一件好事)。这是因为在未来,他们可能会将默认资产更改为完全不符合你应用程序外观的其他资产,并打乱你精心设计的设计。如果你正在为你的应用程序滚动自己的主题,这是有道理的。但如果你使用内置主题(如Holo或DeviceDefault),并尽可能使用可用资源,试图让你的应用程序看起来尽可能符合谷歌的设计准则,那么这将确保应用程序尽可能保持谷歌的设计美感。如果你正在滚动你自己的主题,并且不想被核心资产的变化搞得一团糟,那么你只需滚动你自己的资产以符合你自己的主题。这太完美了,谢谢!我要找的是蜂窝型的,它只是一个人的轮廓。我在android-11参考资料文件夹中找到了它。如果谷歌能够直接从SDK中公开这些图片,而不是我们需要在本地包含它们,那将是多么美好啊。。。这样,我们的应用程序将始终与当前的外观保持同步。@eidylon虽然这样做很好,但这正是谷歌不这么做的原因(这是一件好事)。这是因为在未来,他们可能会将默认资产更改为完全不符合你应用程序外观的其他资产,并打乱你精心设计的设计。如果你正在为你的应用程序滚动自己的主题,这是有道理的。但如果你使用内置主题(如Holo或DeviceDefault),并尽可能使用可用资源,试图让你的应用程序看起来尽可能符合谷歌的设计准则,那么这将确保应用程序尽可能保持谷歌的设计美感。如果您正在滚动您自己的主题,并且不想被核心资产的更改搞得一团糟,那么您只需滚动您自己的资产以符合您自己的主题。