Xamarin.android Xamarin Android,使用带有选择和选择参数的游标加载程序获取联系人手机号码

Xamarin.android Xamarin Android,使用带有选择和选择参数的游标加载程序获取联系人手机号码,xamarin.android,selection,android-contacts,feature-selection,android-cursorloader,Xamarin.android,Selection,Android Contacts,Feature Selection,Android Cursorloader,我正在尝试获取用户从Android联系人列表中选择的联系人的联系人详细信息,使用Intent作为以下代码: Intent Intent = new Intent(Intent.ActionPick, ContactsContract.Contacts.ContentUri); Intent.SetType(ContactsContract.Contacts.ContentType); StartActivityForResult(Inten

我正在尝试获取用户从Android联系人列表中选择的联系人的联系人详细信息,使用Intent作为以下代码:

Intent Intent = new Intent(Intent.ActionPick, ContactsContract.Contacts.ContentUri);            
        Intent.SetType(ContactsContract.Contacts.ContentType);
        StartActivityForResult(Intent, 3);
现在,在Intent结果上,我运行以下代码以获取特定的联系信息:

public override void OnActivityResult(int requestCode, int resultCode, Intent data)
    {           
        if (requestCode == 3 && resultCode == -1 && data != null) //result code -1 means OK 0 Means cancelled Result.Ok
        {
            var ContactData = data.Data;
            string ID = "";
            string name = "";
            string address = "";
            byte[] picture = new byte[0];
            List<string> numbers = new List<string>();
            List<string> emails = new List<string>();
            string mobile = "";
            string email = "";
            string selectionString  = "id = ?";



            string[] columnsNames = new string[] {
                ContactsContract.Contacts.InterfaceConsts.Id,
                ContactsContract.Contacts.InterfaceConsts.DisplayName,
                ContactsContract.Contacts.InterfaceConsts.PhotoUri
            };

            var loader = new CursorLoader(Statics.mainActivity, ContactData, null, null, null, null);                
            var cursor = (ICursor)loader.LoadInBackground();


            if (cursor.MoveToFirst())
            {
                ID = cursor.GetString(cursor.GetColumnIndex(columnsNames[0]));
                name = cursor.GetString(cursor.GetColumnIndex(columnsNames[1]));
                picture = cursor.GetBlob(cursor.GetColumnIndex(columnsNames[2]));                  
            }

            //Store Contact ID
            string[] selectionStringArgs = new string[] { ID };

            //Phone Numbers
            string[] columnsNames2 = new string[] {
                ContactsContract.CommonDataKinds.Phone.Number                 
            };

            var loader2 = new CursorLoader(Statics.mainActivity, ContactsContract.CommonDataKinds.Phone.ContentUri, columnsNames2, selectionString, selectionStringArgs, null);
            var cursor2 = (ICursor)loader2.LoadInBackground();

            while (cursor2.MoveToNext())
            {
                numbers.Add(cursor2.GetString(cursor2.GetColumnIndex(columnsNames2[0])));
            }

            //Email Address
            string[] columnsNames3 = new string[] {
                ContactsContract.CommonDataKinds.Email.Address
            };


            var loader3 = new CursorLoader(Statics.mainActivity, ContactsContract.CommonDataKinds.Email.ContentUri, columnsNames3, selectionString, selectionStringArgs, null);
            var cursor3 = (ICursor)loader3.LoadInBackground();

            while (cursor3.MoveToNext())
            {
                emails.Add(cursor3.GetString(cursor3.GetColumnIndex(columnsNames3[0])));
            }



            int TempRecepitntID = 0;
            EmployeesViewModel tempRecipent = new EmployeesViewModel();
            TempRecepitntID = Statics.mainActivity.currentViewModel.SelectedChat.ReceiverEmployee;

            foreach (EmployeesViewModel evm in Statics.mainActivity.currentViewModel.Employees)
            {
                if (evm.ID == TempRecepitntID)
                    tempRecipent = evm;
            }

            new Android.Support.V7.App.AlertDialog.Builder(Statics.mainActivity)
                   .SetPositiveButton("Yes", (sender1, args) =>
                   {
                       Statics.mainActivity.currentViewModel.AddMessage(picture, tempRecipent, Statics.mainActivity.currentViewModel.SelectedChat.ID, "contact", 0, "", name, numbers[0], mobile, email, address);
                   })
                   .SetNegativeButton("No", (sender1, args) =>
                   {
                        // cancel
                    })
                   .SetMessage("Are you shure you want to send?")
                   .SetTitle("System Message")
                   .Show();                
        }
    }
但现在它返回0个结果,我在互联网上找不到适用于Xamarin android的任何内容,请帮助


谢谢,

最终我找到了解决方案,我在cursorloader方法的选择参数中使用了以下字符串:

字符串选择字符串=ContactsContact.CommonDataTypes.Phone.InterfaceConsts.ContactId+“=”+ID

现在只检索选定的联系人号码


我希望这能帮助其他人。

在@TMSL的附加信息中,我在这个bloque后面添加了代码

if (cursor.MoveToFirst())
                    {
                        ID = cursor.GetString(cursor.GetColumnIndex(columnsNames[0]));
                        name = cursor.GetString(cursor.GetColumnIndex(columnsNames[1]));
                        picture = cursor.GetBlob(cursor.GetColumnIndex(columnsNames[2]));

                    }
这里

然后我更改了变量
Loader2
定义中使用的参数,在
null
中转换
selectionstringrs

var loader2 = new CursorLoader(this.Activity, ContactsContract.CommonDataKinds.Phone.ContentUri, columnsNames2, selectionString, null,null);
                    var cursor2 = (ICursor)loader2.LoadInBackground();
我从xamarin指南中找到了文档

  • Uri–ContentProvider的完全限定名
  • 投影–指定要为光标选择的列
  • Selection–类似于SQLWHERE子句
  • SelectionAgs–选择中要替换的参数
  • SortOrder–要排序的列
因此,@TMSAL代码中使用的变量
selectionstringrs
不能使用“contact_id=2700”这样的值,因为CursorLoader
SelectionArgs
的参数不是过滤器,而不是“要在选择中替换的参数”


我希望这也能对其他人有所帮助。

我把它放在验证游标的第一个
IF
bloque中的变量
ID
之后。movefirst()。。。我得到一个错误:无法在索引1处绑定参数,因为索引超出范围。该语句有0个参数。
            selectionString = ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + ID;
var loader2 = new CursorLoader(this.Activity, ContactsContract.CommonDataKinds.Phone.ContentUri, columnsNames2, selectionString, null,null);
                    var cursor2 = (ICursor)loader2.LoadInBackground();