2017-05-03 4 views
4

Xamarinフォームを使用してハイブリッドモバイルアプリケーションを作成しています。私はAndroidのマニフェストに許可「READ_CONTACTS」を追加した連絡先イメージを取得するXamarinフォーム

  1. 名前
  2. 画像

:私は、以下の詳細のすべての電話帳の連絡先のリストを表示したいです。以下はすべての連絡先を取得するためのコードです:

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コンポーネントまたは他のコンポーネントを使用したくありません。

答えて

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(ContactDetailCursor.GetColumnIndex(ContactDetailProjection [4])))。ToString()); –

+0

Androidの 'Activity'クラスの' ContentResolver'プロパティを使用していますか?または他の場所から?私はちょうどあなたが 'Activity'の外でこれを呼び出す場合には、アプリケーションのコンテキストを調べなければならない場合に、より多くの情報で答えを更新しました。 –

+0

ええ、 "otherStream"を使って問題を解決しました:)しかし最後の質問は、今私が "contact.PhotoId = imagesource;"と書きました。 "Xamarin.Forms.ImageSource型を暗黙的に文字列に変換することはできません" –

関連する問題