Android는 2.0 version을 기준으로 Contacts(주소록) 정보를 가져오는 API가 변경되었다. Contacts class가deprecation되고 ContactsContract class로 바뀌었고 여러 계정의 주소록을 동기화 및 결합화 하여 통합관리하려는 의지를 보이고 있다. 자세한 사항은 인터넷 및 개발자 사이트를 참조하길 바란다.
Contacts를 가져오는 부분은 여러 사이트에서 소개되고 있고, 예제도 공개되어 있지만 대부분이 Display Name과 Phone Number를 가져오는 것에 대한 소개와 예제가 대부분이다. 하지만 Contacts에서는 다른정보도 다루고 있고 그 부분을 필요로 하는 경우가 있기 때문에 그 중 Email과 Picture를 가져오는 부분을다루려고 한다.
우선 대표적으로 Contacts의 정보를 가져오는 경우 가장 기본적인 구조는 다음과 같다.
Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); |
public final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 원본 위치 <http://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)> uri : 'content://' scheme를 가지고 가져올 Content Provider를 결정함. projection : 리턴 받아야 하는 데이터 column의 이름들이며, null 지정 시 모든 column을 가져옴. selection : SQLite의 WHERE 구문의 내용을 결정함. selectionArgs : selection의 arguments 들을 나열함. sortOrder : SQLite의 ORDER BY와 같은 정렬을 결정함. |
Code 보기
API-7에 제공된 상기 Sample code는 Android 2.1 버전에 적용이 되며 다음 ListAdapter에서 그 Display Name과 QuickContactBadge를 읽어올 수 있다. QuickContactBadge는 Android Contact에서 Picture를 선택하면 Look-up 하는 component를 말한다. Android Contact를 확인해보면 확실하게 알 수 있을 것이다. 하지만 어떤 이유에서인지 상기 code를 build 하면 QuickContactBadge에 Picture를 읽어오지 못하고 기본 이미지(@drawable/ic_contact_picture)를 보여주고 있는 문제가 있다.
Code 보기
그럼 상기 Sample code를 기반으로 Contact Picture와 Email을 가져오는 code를 추가하기로 하자.
우선 Android Contacts에 5개의 Contact을 저장한다.
임의의 5개의 Contact를 저장하고 그 값 중 Name, Picture과 E-mail을 읽어와서 보여주는 것이 이번 글의 핵심이다. 우선 Sample code를 재 사용하기 위해 QuickContactBadge를 GONE하고 Picture를 넣을 ImageView와 Email을 넣을 TextView component를 추가한다.
Code 보기
그리고 Java code에서 ContactListItemCache class를 재정의하고 ListAdapter의 newView() method를 수정한다. 이 부분은 기존 sample code에서 XML파일에 추가된 TextView와 ImageView를 추가한 것이므로 설명할 부분은 없다.
Code 보기
현재 Android 2.0 버전은 앞에서 언급했듯이 통합환경을 지원하는 것으로 Contacts를 여러 가지 방법으로 읽어올 수 있는 것 같다. 여기서는 통합해서 가져온 Contacts에서 뽑아내는 것이 아니라 Email은 따로 Cursor로 읽어와 보여주는 방식을 취한다. (필자의 한계가 원인이다… ㅠ.ㅠ)
우선 가장 간단한 Name 부분을 채우기로 한다. 현재 sample code에 사용된 방법을 사용해도 되지만 추가적인 학습 차원에서 가장 일반적인 방법으로 사용해 보도록 한다. 이 code는 ListaAdapter의 bindView() method 내부에 사용된 code이다.
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
nameView.setText(name);
하나 주의 할 사항은 Sample code에서는 ListAdapter의 종류를 ResourceCursorAdapter를 사용하고 있기때문에 전달된 cursor에는 Name을 제외한 Picture, Number와 Email 정보를 담고 있지 않다. 그 대신에LookupKey, Contact ID와 HAS_PHONE_NUMBER 등의 정보를 알 수 있기 때문에 그 정보를 사용하여 현재 Contact ID에 해당하는 Picture, Number와 Email의 정보를 찾아와 보여주는 방식을 취할 것이다.
그럼 다음 순서인 Picture을 가져오기 위해 Contact ID가 필요한데 이 부분은 기존 Sample code에서 가져온 값이 있으므로 다음과 같이 재 사용하기로 한다. 다음은 Picture를 가져오기 위해 ListAdapter의bindView() method 내부에서 사용된 code이다.
Code 보기
Contact ID를 통해 URI를 읽어오고 Picture를 InputStream으로 받아와 ImageView에 보여준다.다음으로 Email을 읽어와야 한다. 이미 언급했듯이 Email은 Contact ID를 사용해 새로운 Cursor를 가져와 보여주는 방식을 사용한다. 다음은 ListAdapter의 bindView() method 내부에서 사용된 code이다.
Code 보기
Email을 가져오기 위해 ContactsContract.CommonDataKinds.Email.CONTENT_URI와 Contact ID(contactId)를 이용해 ID값에 해당하는 Email의 DATA와 TYPE를 가져온다. 그 후 while() 구문을 통해 Email의 여러 Type에 따른 출력을 수행한다. 여기에서는 TextView 하나에 Email을 출력할 생각이기 때문에 만약 Home, Work 등 여러 Email이 존재하더라도 하나의 Email만을 가져오게 될 것이다. 이 부분에 대해서는 약간의 수정만으로 변경이 가능하니 따로 언급하지 않겠다.
마지막으로 전화번호를 가져오기 위해 Phone.CONTENT_URI와 Contact ID(contactId)를 이용해 Email과동일하게 NUMBER와 TYPE를 가져온다. 그 후 Type 별로 나누어 출력이 가능하다. Email과 마찬가지로Mobile number만 가져올 생각이기 때문에 Mobile Type 만을 출력한다.
Code 보기
이제 Name, Picture, Email과 Number로 이루어진 ListView를 출력할 준비가 되었다. build 한 후 install 과정을 거치면 다음과 같은 화면을 확인 할 수 있다.
댓글 없음:
댓글 쓰기