본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.
21장. 콘텐츠 프로바이더
21.2.1. 주소록 앱 데이터 획득
앱을 개발할 때 외부 앱 연동의 대부분은 외부 앱의 화면을 실행하거나 데이터를 이용하기 위함입니다.
화면 연동은 액티비티 실행이고 이전에 인텐트를 살펴보았던 곳에서 다루었습니다. 이곳에서는 스마트폰에 기본으로 설치된 앱 중 이용비율이 높은 주소록과 갤러리의 데이터를 이용하는 방법을 살펴보겠습니다. 그런데 주소록, 갤러리 앱이 아닌 다른 어떤 앱이라도 모두 콘텐츠 프로바이더를 이용하는 방법이므로 작성방법이 같으며 Uri 값만 다르게 설정하는 것입니다.
스마트폰에 기본으로 설치된 앱 중 데이터 연동에 가장 많이 이용되는 앱 중 하나가 주소록 앱(공식 이름은 Contacts App)입니다. 주소록 앱의 목록 화면을 띄우고 그곳에서 사용자가 선택한 홍길동의 전화번호 혹은 이메일 등의 데이터를 획득하는 식으로 많이 연동합니다. 이렇게 하려면 우선 인텐트로 주소록 앱의 목록 액티비티를 띄우고 다시 사용자가 선택한 홍길동의 전화번호 등을 콘텐츠 프로바이더를 이용하여 획득해야 합니다. 주소록의 콘텐츠 프로바이더 이용은 퍼미션 등록이 필요합니다.
<uses-permission android:name="android.permission.READ_CONTACTS"/>
우선 인텐트를 발생시켜 주소록의 목록 액티비티를 띄워야 합니다.
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setData(Uri.parse("content://com.android.contacts/data/phones"));
startActivityForResult(intent, 10);
인텐트 부분에서 살펴보았던 내용으로 위와 같은 Action 문자열과 Data 정보를 설정하여 인텐트를 발생시키면 사용자 화면에 주소록의 목록 화면이 출력됩니다. 사용자가 목록 화면에서 홍길동을 눌렀을 때 화면이 자동으로 되돌아와야 하므로 startActivityForResult ( ) 함수를 이용하여 인텐트를 발생시킵니다.
startActivityForResult ( ) 함수로 인해 화면이 다시 되돌아올 때 자동으로 호출되는 onActivityResult ( ) 함수에서 콘텐츠 프로바이더를 이용해 구체적으로 원하는 데이터를 획득합니다.
String id= Uri.parse(data.getDataString()).getLastPathSegment();
onActivityResult ( ) 함수 내부의 코드이며 주소록 목록 화면이 되돌아왔을 때 사용자가 선택한 홍길동의 결과를 받는 코드입니다. 그런데 쉽게 생각하기에는 사용자가 홍길동을 선택해 되돌아오면 홍길동의 전화번호가 넘어올 것처럼 보이지만, 그렇지는 않습니다. 실제 넘어오는 데이터는 사용자가 선택한 홍길동을 식별하는 식별자 값만 넘어옵니다. 전화번호를 넘기지 않는 이유는 주소록에 사람 하나에 대한 데이터가 너무 많기 때문입니다. 사람 이름부터 전화번호, 이메일, 이미지 데이터 등이 있고 전화번호도 여러 개, 사람 이름도 first name, last name 등으로 구분되어 있습니다.
결국, 홍길동을 식별하는 식별자 값만 넘겨주며, 이 값을 조건으로 구체적으로 원하는 데이터를 다시 주소록 쪽에 요청해야 합니다. 이때 콘텐츠 프로바이더가 이용됩니다. 위의 코드는 사용자가 선택한 홍길동을 식별하는 식별자 값을 획득한 구문으로 식별자 값은 URL 형태로 전달되며 URL의 맨 마지막 단어가 식별자 값입니다.
Cursor cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER },
ContactsContract.Data._ID + "=" + id, null, null);
주소록의 콘텐츠 프로바이더를 이용해 데이터를 획득하는 구문입니다. query ( ) 함수를 이용하며 함수의 첫 번째 매개변수 값으로 ContactsContract.Data.CONTENT_URI을 지정하여 주소록의 콘텐츠 프로바이더를 식별하였으며, 두 번째 매개변수 부분에 획득하고자 하는 데이터를 문자열 배열로 시하였습니다. 위의 코드에서는 사람이름과 전화번호를 요청한 형태입니다. 세 번째 매개변수가 where 조건으로 홍길동의 식별자 값을 지정하였습니다. 이렇게 요청하면 결과 데이터가 Cursor 객체로 전달되며 이후 Cursor를 이용하여 데이터를 획득하는 구문은 안드로이드 DBMS 프로그램과 차이가 없습니다.
cursor.moveToFirst();
String name = cursor.getString(0);
String phone=cursor.getString(1);
'Android' 카테고리의 다른 글
[깡샘의 안드로이드 프로그래밍] 정리 25 - GoogleMap (0) | 2018.01.06 |
---|---|
[깡샘의 안드로이드 프로그래밍] 정리 24 - LocationManager (0) | 2018.01.06 |
[깡샘의 안드로이드 프로그래밍] 정리 22 - ActivityManager (1) | 2018.01.06 |
[깡샘의 안드로이드 프로그래밍] 정리 21 - NotificationChannel (0) | 2018.01.06 |
[깡샘의 안드로이드 프로그래밍] 정리 20 - persistent bottom sheet (0) | 2018.01.06 |