在输入法开发中,需要获取通讯录的联系人姓名,然后将其编码导入词库中,本文就简单介绍一下两个平台上获取联系人信息的方法;


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>();
            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);

            return list;

        }

希望本文能对你有所帮助。