Xamarin表单列出了联系人和电话号码

时间:2017-10-13 19:48:43

标签: c# xamarin xamarin.android

我正在创建一个应该列出联系人和联系人电话的应用程序。我可以做的联系人列表,但我无法列出与特定联系人关联的电话号码。 我一直在网络上寻找可行的解决方案来解决我的问题,但我无法找到解决方案。

这是读取和列出联系人的代码。

public List<Contato> ListaContato()
    {
        var uri = ContactsContract.Contacts.ContentUri;

        string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.Contacts.InterfaceConsts.DisplayName, ContactsContract.Contacts.InterfaceConsts.PhotoId };

        var cursor = Context.ContentResolver.Query(uri, projection, null, null, null);

        var contactList = new List<Contato>();

        if (cursor.MoveToFirst())
        {
            do
            {
                Contato contato = new Contato();
                Telefone telefone = new Telefone();

                contato.Id = cursor.GetInt(cursor.GetColumnIndex(projection[0]));
                contato.NomeContato = cursor.GetString(cursor.GetColumnIndex(projection[1]));
                contato.FotoContato = cursor.GetString(cursor.GetColumnIndex(projection[2]));

                contato.Telefone = CarregarTelefone(contato.Id.ToString());

                contactList.Add(contato);
            }
            while (cursor.MoveToNext());
        }

        return contactList;
    }

另一种方法是列出与联系人关联的电话号码。

public List<Telefone> CarregarTelefone(string contactId)
    {
        //ContactsContract.CommonDataKinds.Phone.SearchDisplayNameKey
        var cursor = Context.ContentResolver.Query(Phone.ContentUri, new String[] { Phone.Number }, ContactsContract.CommonDataKinds.Identity.IdentityColumnId + "=" + contactId, null, null);
        //var c = Context.ContentResolver.Query(Phone.ContentUri, new String[] { Phone.Number }, Phone.ContentItemType + "=" + Phone.TYPE_MOBILE + " and " + Phone.CONTACT_ID + "=" + contactId, null, null);


        List<Telefone> litel = new List<Telefone>();

        //if (cursor.MoveToNext())
        //{
        //    Telefone tele = new Telefone();
        //    tele.NumeroTelefone = cursor.GetString(0);
        //    litel.Add(tele);
        //}

        while (cursor.MoveToNext())
        {
            Telefone tele = new Telefone();
            tele.NumeroTelefone = cursor.GetString(0);
            litel.Add(tele);
        }

        return litel;
    }

我已将此代码用作参考,但它并不能完全为我服务。

  

cursor = contentResolver.query(Phone.CONTENT_URI,                   new String [] {Phone.NUMBER},                   Phone.TYPE +“=”+ Phone.TYPE_MOBILE +“and”+ Phone.CONTACT_ID +“=”+ contactId,null,null);

代码包含在以下链接中:ContentResolver.Query()

那么,我如何能够在我的xamarin应用程序中列出联系人的所有电话号码?

晚安人! 关于发现手机标签(手机,家庭,工作等)的问题,我想说我已经找到了解决方案,我在这里与你分享。

public List<Telefone> CarregarTelefone(string contactId)
    {
        var uri = ContactsContract.Contacts.ContentUri;

        string[] projection = { Phone.Number, CommonColumns.Type };

        var cursor = Context.ContentResolver.Query(Phone.ContentUri, projection, ContactsContract.RawContactsColumns.ContactId + "=" + contactId, null, null);

        List<Telefone> litel = new List<Telefone>();

        if (cursor != null)
        {
            while (cursor.MoveToNext())
            {
                Telefone tele = new Telefone();
                tele.NumeroTelefone = cursor.GetString(0);
                tele.Etiqueta = CarregarEtiqueta(int.Parse(cursor.GetString(1)));
                litel.Add(tele);
            }
        }

        cursor.Close();

        return litel;
    }

现在我仍然需要帮助解决列出联系人群组(家庭,工作,同学,教师等)的问题。我在网上看了一些东西,但我还没有成功。任何提示都非常受欢迎。

1 个答案:

答案 0 :(得分:0)

  

我正在创建一个应该列出联系人和联系人电话的应用程序。我可以做的联系人列表,但我无法列出与特定联系人关联的电话号码。我一直在网络上寻找可行的解决方案来解决我的问题,但我无法找到解决方案。

您无法根据contactId检索电话号码,因为您使用了错误的过滤字符串:

ContactsContract.CommonDataKinds.Identity.IdentityColumnId + "=" + contactId

正确的过滤器如下所示:

ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + contactId

所以CarregarTelefone应如下所示:

public List<Telefone> CarregarTelefone(string contactId)
{
    var cursor = this.ContentResolver.Query(ContactsContract.CommonDataKinds.Phone.ContentUri, new string[] { Phone.Number }, ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + contactId, null, null);

    List<Telefone> litel = new List<Telefone>();

    while (cursor.MoveToNext())
    {
        Telefone tele = new Telefone();
        tele.NumeroTelefone = cursor.GetString(0);
        litel.Add(tele);
    }

    return litel;
}

<强>更新

要搜索礼节,您可以在搜索栏中添加ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type列:

var cursor = this.ContentResolver.Query(ContactsContract.CommonDataKinds.Phone.ContentUri, new string[] { Phone.Number, Phone.InterfaceConsts.Type }, ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + contactId, null, null);

它将为您提供一个int值。您可以将int与type table进行比较,以获取当前类型的手机。