2012년 5월 19일

Android Contacts(주소록)의 정보를 읽어오자.(Android 2.0 이상)




Android 2.0 version 기준으로 Contacts(주소록정보를 가져오는 API 변경되었다. Contacts classdeprecation되고 ContactsContract class 바뀌었고 여러 계정의 주소록을 동기화  결합화 하여 통합관리하려는 의지를 보이고 있다자세한 사항은 인터넷  개발자 사이트 참조하길 바란다.

Contacts 가져오는 부분은 여러 사이트에서 소개되고 있고예제도 공개되어 있지만 대부분이 Display Name Phone Number 가져오는 것에 대한 소개와 예제가 대부분이다하지만 Contacts에서는 다른정보도 다루고 있고  부분을 필요로 하는 경우가 있기 때문에   Email Picture 가져오는 부분을다루려고 한다.




우선 대표적으로 Contacts의 정보를 가져오는 경우 가장 기본적인 구조는 다음과 같다.


Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
상기 코드는 Content Provider를 통해 Contacts의 정보 전체를 가져오는 구조이다. Content Provider의 query 구문의 매개변수는 다음과 같이 정의되어 있다.
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와 같은 정렬을 결정함.
Android SDK 포함된 Sample code(QuickContactsDemo.java and quick_contacts.xml) 다음과 같이 실제 사용되는 부분에 대한 예제가 있다기본 구조와는 틀린 query arguments 채워진 구조이다. Marking  부분의 의미는 'Contacts.CONTENT_URI 위치한 CONTACTS_SUMMARY_PROJECTION 속한 값들  select 조건(DISPLAY_NAME NULL 또는 공백이 아니고 HAS_PHONE_NUMBER 값이 1 PHONE NUMBER 가지는 ) 충족시키는 값들을 내림차순으로 정렬해라' 의미로 해석된다.

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 가져오기 위해 ListAdapterbindView() 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 과정을 거치면 다음과 같은 화면을 확인   있다.

                                                                     
출처 : http://withwani.tistory.com/153

댓글 없음:

댓글 쓰기