C# 如何使用Xamarin/C获取Android设备所有者的用户配置文件数据
我正在为Android 4.0冰激凌三明治和更高版本构建一个应用程序,并希望获得设备所有者的用户档案信息,例如: 显示名称、电子邮件、电话、职务、公司、办公地点、网站和Url 我在阅读的不同Stackoverflow帖子中尝试了不同的方法,包括访问手机帐户,查询用户配置文件ContactsContract.profile.ContentUri。没有骰子。我已经检查了ReadOwnerData和ReadProfile的权限 现在我正在使用此代码查询联系人,但托管查询返回的计数为0C# 如何使用Xamarin/C获取Android设备所有者的用户配置文件数据,c#,android,xamarin,C#,Android,Xamarin,我正在为Android 4.0冰激凌三明治和更高版本构建一个应用程序,并希望获得设备所有者的用户档案信息,例如: 显示名称、电子邮件、电话、职务、公司、办公地点、网站和Url 我在阅读的不同Stackoverflow帖子中尝试了不同的方法,包括访问手机帐户,查询用户配置文件ContactsContract.profile.ContentUri。没有骰子。我已经检查了ReadOwnerData和ReadProfile的权限 现在我正在使用此代码查询联系人,但托管查询返回的计数为0 var c =
var c = act.ManagedQuery (ContactsContract.Profile.ContentUri, null, null, null, null);
int count = c.Count;
string[] columnNames = c.GetColumnNames();
bool b = c.MoveToFirst();
int position = c.Position;
if (position == 0) {
do {
for (int j = 0; j < columnNames.Length; j++) {
string columnName = columnNames[j];
try {
string columnValue = c.GetString(c.GetColumnIndex(columnName));
} catch {}
if (c.GetString(c.GetColumnIndex("is_user_profile")) == "1") {
if (c.GetString(c.GetColumnIndex("has_email")) == "1") {
//var cEmail = ManagedQuery (ContactsContract.Data.ContentUri, null, ContactsContract.Data.InterfaceConsts.HasPhoneNumber + "!=0 AND (" + ContactsContract.Data.InterfaceConsts.Mimetype + "=? OR " + ContactsContract.Data.InterfaceConsts.Mimetype + "=?)", new String[]{ ContactsContract.CommonDataKinds.Email.ContentItemType, ContactsContract.CommonDataKinds.Phone.ContentItemType, ContactsContract.Contacts.InterfaceConsts.Id }, null);
var cEmail = act.ManagedQuery (ContactsContract.CommonDataKinds.Email.ContentUri, null, ContactsContract.CommonDataKinds.Email.InterfaceConsts.Type + " = ?", new String[]{ c.GetString(c.GetColumnIndex(BaseColumns.Id)) }, null);
string[] columnNamesEmail = cEmail.GetColumnNames();
if (cEmail.Count > 0) {
cEmail.MoveToFirst();
do {
sEmail = cEmail.GetString(cEmail.GetColumnIndex(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Type));
//sEmail = cEmail.GetString(cEmail.GetColumnIndex(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data));
//sEmail = cEmail.GetString(cEmail.GetColumnIndex(ContactsContract.CommonDataKinds.Email.InterfaceConsts.ContactId));
} while (cEmail.MoveToNext());
}
cEmail.Close();
}
if (c.GetString(c.GetColumnIndex("has_phone_number")) == "1") {
var cPhone = act.ManagedQuery (ContactsContract.CommonDataKinds.Phone.ContentUri, null, ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + " = ?", new String[]{ c.GetString(c.GetColumnIndex(BaseColumns.Id)) }, null);
string[] columnNamesPhone = cPhone.GetColumnNames();
if (cPhone.Count > 0) {
cPhone.MoveToFirst();
do {
sPhone = cPhone.GetString(cPhone.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type));
} while (cPhone.MoveToNext());
}
cPhone.Close();
}
}
}
} while (c.MoveToNext());
}
c.Close();
有人能指出我如何重写这个查询吗
var cEmail = act.ManagedQuery (ContactsContract.CommonDataKinds.Email.ContentUri, null, ContactsContract.CommonDataKinds.Email.InterfaceConsts.Type + " = ?", new String[]{ c.GetString(c.GetColumnIndex(BaseColumns.Id)) }, null);
或者我应该返回查询用户配置文件或帐户吗?以下是我为他们使用的代码:
账户:
Account[] accounts = AccountManager.Get (Context).GetAccounts ();
foreach (Account acc in accounts) {
--- can only get DisplayName and ID
}
用户配置文件:
var uri = ContactsContract.Profile.ContentUri;
string[] projection = {
ContactsContract.CommonDataKinds.StructuredName.DisplayName,
ContactsContract.CommonDataKinds.Email.Address,
ContactsContract.CommonDataKinds.Phone.Number,
ContactsContract.CommonDataKinds.Organization.Title,
ContactsContract.CommonDataKinds.Organization.Company,
ContactsContract.CommonDataKinds.Organization.OfficeLocation,
ContactsContract.CommonDataKinds.Website.Url };
var cursor = ManagedQuery (uri, projection, null, null, null);
if (cursor.MoveToFirst ()) {
do {
sDisplayName = cursor.GetString (cursor.GetColumnIndex (projection [0]));
sEmail = cursor.GetString (cursor.GetColumnIndex (projection [1]));
sPhone = cursor.GetString (cursor.GetColumnIndex (projection [2]));
sTitle = cursor.GetString (cursor.GetColumnIndex (projection [3]));
sCompany = cursor.GetString (cursor.GetColumnIndex (projection [4]));
sOfficeLocation = cursor.GetString (cursor.GetColumnIndex (projection [5]));
sWebsite = cursor.GetString (cursor.GetColumnIndex (projection [6]));
} while (cursor.MoveToNext());
}
我将电子邮件查询更改为var cEmail=act.ManagedQuery ContactsContract.commondatatypes.email.ContentUri,null,ContactsContract.commondatatypes.email.InterfaceConsts.ContactId+=?,新字符串[]{c.GetStringc.GetColumnIndexBaseColumns.Id},null;但仍然计算出0。你解决了这个问题吗?我正在尝试获取用户名和电子邮件地址?
var uri = ContactsContract.Profile.ContentUri;
string[] projection = {
ContactsContract.CommonDataKinds.StructuredName.DisplayName,
ContactsContract.CommonDataKinds.Email.Address,
ContactsContract.CommonDataKinds.Phone.Number,
ContactsContract.CommonDataKinds.Organization.Title,
ContactsContract.CommonDataKinds.Organization.Company,
ContactsContract.CommonDataKinds.Organization.OfficeLocation,
ContactsContract.CommonDataKinds.Website.Url };
var cursor = ManagedQuery (uri, projection, null, null, null);
if (cursor.MoveToFirst ()) {
do {
sDisplayName = cursor.GetString (cursor.GetColumnIndex (projection [0]));
sEmail = cursor.GetString (cursor.GetColumnIndex (projection [1]));
sPhone = cursor.GetString (cursor.GetColumnIndex (projection [2]));
sTitle = cursor.GetString (cursor.GetColumnIndex (projection [3]));
sCompany = cursor.GetString (cursor.GetColumnIndex (projection [4]));
sOfficeLocation = cursor.GetString (cursor.GetColumnIndex (projection [5]));
sWebsite = cursor.GetString (cursor.GetColumnIndex (projection [6]));
} while (cursor.MoveToNext());
}