Xamarin.android Xamarin Android,使用带有选择和选择参数的游标加载程序获取联系人手机号码
我正在尝试获取用户从Android联系人列表中选择的联系人的联系人详细信息,使用Intent作为以下代码: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
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–要排序的列
selectionstringrs
不能使用“contact_id=2700”这样的值,因为CursorLoaderSelectionArgs
的参数不是过滤器,而不是“要在选择中替换的参数”
我希望这也能对其他人有所帮助。我把它放在验证游标的第一个
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();