2017-05-03 9 views
4

Xamarin Forms를 사용하여 하이브리드 모바일 응용 프로그램을 만들고 있습니다.연락처 이미지 받기 Xamarin Forms

  1. 이름
  2. 이미지 나 안드로이드 매니페스트에 권한 "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 페이지가 : 아래 모든 연락처를 얻을 수있는 코드입니다. 이미지 셀을 사용하고 있습니다.

<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 

내가 이미지를 표시하기 위해 무엇을해야 하는가를 아래 XAML 코드는? 내가 여기서 무엇을 놓치고 있니?

P. Xamarin을 사용하고 싶지 않습니다. 모바일 구성 요소 또는 기타 구성 요소.

답변

3

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

자세한 내용은 다음 리소스를 참조하십시오

+0

오류를 가져 오기 : "객체 참조가 요구된다 비 정적 필드 메서드 또는 속성에 액세스 ContentResolver.OpenInputStream " 내 URI는 다음과 같습니다. var uri = Android.Net.Uri.Parse (새 System.Uri (ContactDetailCursor.GetString (ContactDetailProjection [4]))). ToString()); –

+0

Android'Activity' 클래스의'ContentResolver' 속성을 사용하고 있습니까? 아니면 다른 위치에서? 나는 당신이'Activity'의 외부에서 이것을 호출 할 경우를 대비하여 더 많은 정보로 응답을 업데이트했습니다,이 경우 당신은 응용 프로그램의'Context'를 거쳐야 만합니다. –

+0

예, "otherStream"을 사용하여 문제가 해결되었습니다. :)하지만 마지막 질문은 이제 "contact.PhotoId = imagesource;"라고 썼습니다. "Xamarin.Forms.ImageSource 타입을 암시 적으로 문자열로 변환 할 수 없습니다"라는 오류가 발생합니다. –