输入法开发xamarin开发技术Android开发

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,所以我无法通过这个变量来获知通讯录是否读取完毕,因此设计了一个循环检查的回路来确定读取操作已结束。

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

上一篇 下一篇

猜你喜欢

热点阅读