2015-10-14 9 views
0

Я основываю свой код на примере входа в систему, входящем в состав Android Studio. Этот образец содержит код для заполнения AutoCompleteTextView адресами электронной почты, связанными с контактом устройства ContactsContract.Profile. то есть владельца телефона, я.Погрузчик для данных контакта «Профиль»

Мне нужно продолжать использовать методы интерфейса LoaderCallbacks - onCreateLoader() и onLoaderFinished().

Я хочу, чтобы принести дополнительные подробности о контакте как:

  • номер телефона
  • имя
  • фамилия

Чтобы достичь этого, у меня есть попытался добавить дополнительные поля к интерфейсу ProfileQuery, определенному в sam PLE (который работает правильно, чтобы принести адрес электронной почты):

private interface ProfileQuery { 
    String[] PROJECTION = { 
      // these fields as per Android Studio sample 
      ContactsContract.CommonDataKinds.Email.ADDRESS, 
      ContactsContract.CommonDataKinds.Email.IS_PRIMARY, 

      // these fields added by me 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, 
      ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME 
    }; 
} 

Я модифицировал метод onCreateLoader() удалить ИНЕКЕ сэмпла в надежде получить дополнительные данные:

public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
    return new CursorLoader(this, 
      // Retrieve data rows for the device user's 'profile' contact. 
      Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, 
        ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, 

      // select all fields 
      null, null, 

      // Show primary email addresses first. Note that there won't be 
      // a primary email address if the user hasn't specified one. 
      ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
} 

Для чего на данный момент мои onLoadFinished() просто регистрирует полученные данные:

public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     Log.d("xxx", cursor.getString(0) + cursor.getString(1) + cursor.getString(2) + cursor.getString(3) + cursor.getString(4)); 
     cursor.moveToNext(); 
    } 
} 

Я хотел бы, чтобы каждая строка курсора давала мне полный набор данных, относящихся к контакту профиля. Вместо этого я получаю, казалось бы, случайные поля из этого контакта.

Как я могу получить подробную информацию из моего профиля контакта:

  • адрес электронной почты
  • номер телефона имя
  • имя
  • семьи?
+0

связанные: [Лучший способ получить доступ все детали контактов android] (http://stackoverflow.com/questions/8506985/best-way-to-access-all-the-details-of-android-contacts) –

ответ

0

Приведенный выше код основан на непонимании того, как хранятся данные контактов.

Используется Uri, указывая на таблицу ContactsContract.Data. Developer docs объясняет структуру этой таблицы. Каждая строка в таблице представляет собой элемент информации, а не контакт. например адрес электронной почты, номер телефона и т.д.


проекция определяется специфичен по адресам электронной почты (поскольку образец имеет дело только с электронной почты).Более общий выступ, который может обрабатывать различные типы данных может быть что-то вроде:

private interface ProfileQuery { 
    String[] PROJECTION = { 
      ContactsContract.Data.MIMETYPE, 
      ContactsContract.Data.DATA1, 
      ContactsContract.Data.DATA2, 
      ContactsContract.Data.DATA3, 
    }; 
} 

Поскольку документы объясняют:

DATA1 индексированный столбец и должны быть использованы для элемента данных, который, как ожидается, наиболее часто используется для выбора запросов. Например, для в случае строки, представляющей адреса электронной почты, DATA1 должен, вероятно, использоваться для самого адреса электронной почты, а DATA2 и т. Д. может использоваться для дополнительной информации, такой как адрес электронной почты.

.

Например, Phone.NUMBER - это то же, что и Data.DATA1.


Затем запрос возвращает курсор строку для каждого фрагмента информации в профиле контакта. В моем случае, 3 адреса электронной почты, которые я сохранил, номер телефона и мое имя.

Для каждой строки столбец Data.MIMETYPE определяет, как следует считывать другие столбцы данных. В MIMETYPES могут быть запрошены на основе констант, объявленных в ContactsContract.CommonDataKinds класса, таких как:

  • Email.CONTENT_ITEM_TYPE
  • Phone.CONTENT_ITEM_TYPE
  • StructuredName.CONTENT_ITEM_TYPE
  • Organization.CONTENT_ITEM_TYPE