Запрос, резервное копирование, удаление, вставка контактов в Android - PullRequest
4 голосов
/ 04 августа 2011

Этот вопрос должен стать отправной точкой для всех нас, кто хочет манипулировать контактами в 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.

1 Ответ

1 голос
/ 27 сентября 2011

Вот хорошая отправная точка http://developer.android.com/resources/samples/BusinessCard/index.html

...