Xamarin开发获取联系人信息的方法
2019-04-07 本文已影响3人
临岁之寒
在输入法开发中,需要获取通讯录的联系人姓名,然后将其编码导入词库中,本文就简单介绍一下两个平台上获取联系人信息的方法;
Xamrin.Android平台
1.添加权限申明
在AndroidManifest.xml文件中间添加如下权限申明:
<!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission
android:name="android.permission.READ_CONTACTS" />
2.读取联系人信息
/**
* 获取联系人
*/
public static List<String> getContacts(Context context) {
var result = new List<String>();
if (!PermissionAbout.isGrant(context, Manifest.Permission.ReadContacts)) return null;
Android.Net.Uri uri = Android.Net.Uri.Parse("content://com.android.contacts/contacts"); // 访问所有联系人
ContentResolver resolver = context.ContentResolver;
ICursor cursor = resolver.Query(uri, new String[] { ContactsColumns.DisplayName }, null, null, null);
if (cursor == null) return result;
while (cursor.MoveToNext()) {
String str = cursor.GetString(0);
if (str.Length < 2) continue;
result.Add(str);
}
cursor.Close();
return result;
}
其中PermissionAbout.isGrant是我自己写的一个辅助方法,实现如下:
public static bool isGrant(Context context, string permission) {
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M && (context.CheckSelfPermission(
permission) != Permission.Granted)) {
if (context is Activity) {
((Activity)context).RequestPermissions(new String[] { permission }, 1);
}
return false;
}
return true;
}
Xamarin.iOS平台
1.添加权限申明
在info.plist文件中添加Privacy - Contacts Usage Description
,描述字符串:描述一下你申请这个权限的理由,类似下面的效果:
2.读取联系人
public async Task<List<string>> getContacts() {
var status = CNContactStore.GetAuthorizationStatus(CNEntityType.Contacts);
var store = new CNContactStore();
if (status != CNAuthorizationStatus.Authorized) {
var result = await store.RequestAccessAsync(CNEntityType.Contacts);
if (result.Item1 == false) {
return null;
}
}
var d = CNContactFormatter.GetDescriptorForRequiredKeys(CNContactFormatterStyle.FullName);
var requst = new CNContactFetchRequest(d);
List<String> list = new List<string>();
int size = 0;
CNContactStoreListContactsHandler handler = (CNContact contact, ref bool stop) => {
string name = contact.FamilyName + contact.MiddleName + contact.GivenName;
list.Add(name);
};
store.EnumerateContacts(requst, out var error, handler);
while (size != list.Count) {
size = list.Count;
await Task.Delay(10);
}
return list;
}
在实际运行中ref bool stop的值一直都是false,所以我无法通过这个变量来获知通讯录是否读取完毕,因此设计了一个循环检查的回路来确定读取操作已结束。
希望本文能对你有所帮助。