Этот вопрос должен стать отправной точкой для всех нас, кто хочет манипулировать контактами в Android.
Перво-наперво
Насколько мне известно, начиная с уровня API 5 интерфейс API контактов изменился, поэтому, чтобы приложение работало корректно, мне нужно проверить, чтоAndroid OS находится на телефоне, и если предыдущие 5 используют один контент-провайдер или использовать более новый.Единственное раздражение в этом случае - это предупреждения о том, что я устарел.Приложение построено на Android 2.3.3, но должно работать с 1.5 +
1.Запрос контактов
Это самая простая часть, которую нужно сделать.Обычно запрос означает получение данных, таких как имя контакта, телефоны, изображение, электронная почта и отображение их в виде списка.Например, вот как я делал это в API до 5
String[] projectionPeople = new String[] {People._ID, People.NAME,};
String[] projectionPhone = new String[] {Phones.NUMBER};
try {
// Get the base URI for People table in Contacts content provider.
// which is: content://contacts/people/
Uri contactUri = People.CONTENT_URI;
ContentResolver resolver = getContentResolver();
Cursor phonesCursor = null;
Cursor peopleCursor = resolver.query (contactUri,
projectionPeople, //Which columns to return.
"People.NAME is not null", // WHERE clause--we won't specify.
null, // Selection Args??
People.DEFAULT_SORT_ORDER); // Order-by name
if (peopleCursor != null && peopleCursor.getCount() >0)
{
// go to the beginning of the list
peopleCursor.moveToFirst();
do
{
//do something with current contact info
phoneUri= Uri.withAppendedPath(personUri, Contacts.People.Phones.CONTENT_DIRECTORY);
phonesCursor = resolver.query(phoneUri,
projectionPhone,
null,
null,
Phones.DEFAULT_SORT_ORDER);
if (phonesCursor!=null && phonesCursor.getCount()>0)
{
phonesCursor.moveToFirst();
lstPhones = new ArrayList<String>();
do
{
//add phone numbers to a List<String> for instance
} while (phonesCursor.moveToNext());
if (phonesCursor != null && !phonesCursor.isClosed())
phonesCursor.close();
} while (peopleCursor.moveToNext());
if (peopleCursor != null && !peopleCursor.isClosed())
peopleCursor.close();
}
}
catch (Exception ex)
{
}
}
Еще не пробовал это на новом API, но курсор должен выглядеть как
final String[] projection = new String[] {
RawContacts.CONTACT_ID, // the contact id column
RawContacts.DELETED // column if this contact is deleted
};
final Cursor rawContacts = managedQuery(RawContacts.CONTENT_URI, // the URI for raw contact provider
projection
null, // selection = null, retrieve all entries
null, // selection is without parameters
null); // do not order
Конечно,это нужно проработать немного подробнее, но оно должно обеспечить основы простого запроса к поставщику контента Contacts
2.Резервное копирование
Сначала я подумал об этом: если я знаю идентификатор контакта, я создаю таблицы в базе данных sqlite точно так же, как столбцы курсора и вставляю все данные в мои таблицы.Это не простая задача, так как требует много кодирования, не говоря уже о том, что разные apis имеют разные структуры таблиц.Что было бы лучшим решением для резервного копирования одного контакта или нескольких контактов?
3.Удалить
Это должно работать на всех API, использующих контент-провайдеров, но данные распространяются на многие пакеты и Uris, и я не уверен, откуда удалить
4.Вставьте
После резервного копирования контакта, возможно, потребуется восстановить / вставить его снова.Как и в случае удаления, на какой Uris мне нужно вставить?
Пожалуйста, давайте попробуем проработать эту проблему, чтобы в будущем те, кому нужно использовать Контакты в приложениях Android, могли бы воспринимать этот вопрос как надежный старт.точка.Спасибо сообществу stackoverflow.