Xamarin開發獲取聯絡人資訊的方法
在輸入法開發中,需要獲取通訊錄的聯絡人姓名,然後將其編碼匯入詞庫中,本文就簡單介紹一下兩個平臺上獲取聯絡人資訊的方法;
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,所以我無法通過這個變數來獲知通訊錄是否讀取完畢,因此設計了一個迴圈檢查的迴路來確定讀取操作已結束。
希望本文能對你有所幫助。