获取联系图像Xamarin表格



我正在使用Xamarin表单创建一个混合移动应用。我想显示所有电话簿联系人的列表,其中包含以下详细信息:

  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

为了显示图像,该怎么办?我在这里缺少什么?

P.S。我不想使用Xamarin.mobile组件或任何其他组件。

Android通过内容提供商和内容解析器从其他应用程序访问文件。因此,您首先必须将该content://方案URL转换为文件流。您可以这样做:

// 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);

有关更多信息,请参见以下资源:

  • https://developer.xamarin.com/guides/android/platform_features/intro_to_to_content_providers/
  • https://developer.android.com/guide/topics/providers/content-providers.html

最新更新