Xamarin Forms Androidアプリケーションの一部は、ユーザーの連絡先を電話からリストに取得します。連絡先を取得する方法は次のとおりです。
この時点まで、アプリケーションをテストするために、テスト連絡先の.vcfファイルをAndroidエミュレーターにインポートしていました。これは正しく機能し、私のメソッドは連絡先のリストを返します。
ただし、電話の連絡先アプリを開いて新しい連絡先を入力することにより、Androidエミュレーターに連絡先を手動で追加した場合。このメソッドはまだ.vcf連絡先のみを返し、作成したばかりの新しい連絡先は含まれていません。
.vcfの連絡先は、手動で入力した連絡先とは異なる方法で電話に保存されると思います。投影を作成するときに間違った場所を見ていますか?
public class PhoneContacts_Android : IPhoneContacts
{
private List<Contact> _contacts = new List<Contact>();
public List<Contact> GetContactsList()
{
if (ContextCompat.CheckSelfPermission(MainActivity.ThisActivity, Manifest.Permission.ReadContacts) == (int)Permission.Granted)
{
var uri = ContactsContract.CommonDataKinds.StructuredPostal.ContentUri;
string[] projection = {
ContactsContract.Contacts.InterfaceConsts.Id,
ContactsContract.Contacts.InterfaceConsts.DisplayName,
ContactsContract.CommonDataKinds.StructuredPostal.FormattedAddress,
ContactsContract.CommonDataKinds.StructuredPostal.Street,
ContactsContract.CommonDataKinds.StructuredPostal.City,
ContactsContract.CommonDataKinds.StructuredPostal.Region,
ContactsContract.CommonDataKinds.StructuredPostal.Postcode
};
var cursor = MainActivity.ThisActivity.ContentResolver.Query(uri, projection, null, null, null);
_contacts = new List<Contact>();
if (cursor.MoveToFirst())
{
do
{
var _contact = new Contact();
_contact.Address = new Address();
_contact.Id = (int) cursor.GetLong(cursor.GetColumnIndex(projection[0]));
_contact.DisplayName = cursor.GetString(cursor.GetColumnIndex(projection[1]));
_contact.Address.AddressLine1 = cursor.GetString(cursor.GetColumnIndex(projection[2]));
_contact.Address.AddressLine2 = cursor.GetString(cursor.GetColumnIndex(projection[3]));
_contact.Address.City = cursor.GetString(cursor.GetColumnIndex(projection[4]));
_contact.Address.State = cursor.GetString(cursor.GetColumnIndex(projection[5]));
_contact.Address.ZipCode = cursor.GetString(cursor.GetColumnIndex(projection[6]));
if (string.IsNullOrWhiteSpace(_contact.FirstName) && _contact.DisplayName != null)
{
string[] words = _contact.DisplayName.Split(' ');
_contact.FirstName = words[0];
_contact.NickName= words[0];
if (string.IsNullOrWhiteSpace(_contact.LastName))
_contact.LastName = words[1];
}
_contacts.Add(_contact);
} while (cursor.MoveToNext());
}
return _contacts;
}
else
{
ActivityCompat.RequestPermissions(MainActivity.ThisActivity, new System.String[] { Manifest.Permission.ReadContacts }, 1);
return null;
}
}
}
私は問題を見つけました。
私のURIはContactsContract.CommonDataKinds.StructuredPostal.ContentUriに向けられていました。
手動で入力した連絡先に住所がない場合、StructuredPostalデータモデルにはありませんでした。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加