获取联系人图片 Xamarin 表单

Posted

技术标签:

【中文标题】获取联系人图片 Xamarin 表单【英文标题】:Get Contact Image Xamarin Forms 【发布时间】:2017-10-01 01:07:54 【问题描述】:

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

    姓名 图片

我在 android manifest 中添加了“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】:

Android 通过 Content Providers 和 Content Resolvers 访问来自其他应用程序的文件。因此,您首先必须将 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_content_providers/ https://developer.android.com/guide/topics/providers/content-providers.html

【讨论】:

出现错误:“访问非静态字段方法或属性 ContentResolver.OpenInputStream 需要对象引用”我的 uri 是:var uri = Android.Net.Uri.Parse(new System.Uri (ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[4]))).ToString()); 您是否使用了Android Activity 类的ContentResolver 属性?还是来自其他地方?我刚刚用更多信息更新了答案,以防您在 Activity 之外调用它,在这种情况下,您必须通过应用程序 Context 是的,使用“otherStream”解决了这个问题:) 但是最后一个问题,现在当我写“contact.PhotoId = imagesource;”时我收到一条错误消息,提示“无法将 Xamarin.Forms.ImageSource 类型隐式转换为字符串” 因为Contact 类上的PhotoId 属性可能是string 而不是ImageSource 类型。 解决了我的问题。谢谢:)

以上是关于获取联系人图片 Xamarin 表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错

如何从联系人中获取联系人图片 URL?

获取选定的联系人图片 - Android

获取联系人图片会引发 NPE

Wordpress 联系表单:想要创建一个联系表单以允许从页面或 url 参数动态获取值的隐藏字段

android获取联系人图片、姓名和手机号码