获取联系人头像 Xamarin Forms

5
我正在使用Xamarin Forms创建混合移动应用程序。我想显示所有电话簿联系人的列表,并列出以下详细信息:
  1. 名称
  2. 图像
我已在android清单中添加了"READ_CONTACTS"权限。以下是获取所有联系人的代码:
var contactList = new List < MContacts > ();

var ContactDetailURI = ContactsContract.Contacts.ContentUri;

string[] ContactDetailProjection = {
 ContactsContract.Contacts.InterfaceConsts.Id,
 ContactsContract.Contacts.InterfaceConsts.DisplayName,
 ContactsContract.ContactsColumns.ContactLastUpdatedTimestamp,
 ContactsContract.Contacts.InterfaceConsts.PhotoId,
 ContactsContract.Contacts.InterfaceConsts.PhotoUri,
 ContactsContract.Contacts.InterfaceConsts.PhotoFileId,
 ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
};

var ContactDetailCursor = Forms.Context.ContentResolver.Query(
 ContactDetailURI,
 ContactDetailProjection,
 null,
 null,
 null
);

if (ContactDetailCursor.MoveToFirst()) {
 do {
    var contact = new MContacts();
    contact.Id = ContactDetailCursor.GetLong(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[0]));
    contact.DisplayName = ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[1]));
    contact.PhotoId = ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[6]));

    contactList.Add(contact);

 } while (ContactDetailCursor.MoveToNext());
}

return contactList;

我有一个XAML页面,将用于显示数据。我正在使用图像单元格。以下是XAML代码:

<ContentPage.Content>
    <ListView x:Name="ContactList">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell
                    Text="{Binding DisplayName}"
                    ImageSource="{Binding PhotoId}">
                </ImageCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage.Content>

我可以获取联系人姓名,但在图像字段中,我只得到了这个:

content://com.android.contacts/contacts/1/photo

我该怎么做才能显示图片?我漏掉了什么?

附注:我不想使用Xamarin.Mobile组件或其他任何组件。

1个回答

3

Android通过内容提供者(Content Providers)和内容解析器(Content Resolvers)获取其他应用程序的文件。 因此,您首先必须将该content://方案URL转换为文件流(filestream)。 您可以像这样做:

// convert uri to stream (Android code, ContentResolver is a property of the Activity class):
var stream = ContentResolver.OpenInputStream(uri);

// or when not in an activity (e.g. a service):
var otherStream = Android.App.Application.Context.ContentResolver.OpenInputStream(uri);

// eventually convert the stream to imagesource for consumption in Xamarin Forms:
var imagesource = Xamarin.Forms.ImageSource.FromStream(() => stream);

请参阅以下资源以获取更多信息:

出现错误: “需要对象引用才能访问非静态字段方法或属性ContentResolver.OpenInputStream”我的URI是: var uri = Android.Net.Uri.Parse(new System.Uri(ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[4]))).ToString()); - Zain SMJ
你正在使用Android的Activity类的ContentResolver属性吗?还是从其他位置获取数据?如果你在Activity之外调用它,我刚刚更新了这个答案并提供了更多信息。在这种情况下,你必须通过应用程序上下文来访问它。 - Tim Klingeleers
是的,使用“otherStream”解决了问题 :) 但是最后一个问题,现在当我写“contact.PhotoId = imagesource;”时,会出现错误,提示“无法隐式转换类型Xamarin.Forms.ImageSource为字符串”。 - Zain SMJ
因为您的Contact类上的PhotoId属性可能是一个string而不是ImageSource类型。 - Tim Klingeleers
问题已解决。谢谢 :) - Zain SMJ
不是对我有所帮助,请帮我。 - Igor Strekha

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