안드로이드/Deep in the AOS

Content Provider :: 앱 구성 요소 4대 컴포넌트 :: 갤러리에서 사진 가져오기 [ Deep in the AOS ]

앱과 앱간의 데이터 연동을 목적으로 하는 컴포넌트

한 앱에서 다른 앱의 Data를 사용해야 하는 경우에 Content Provider를 이용합니다.

ex) 카카오톡에서 사진을 전송할 때 갤러리 앱의 사진 데이터를 이용하는 경우

 

안드로이드 개발자 문서에는 이렇게 설명하고 있습니다.

Content Provider는 중앙 저장소로의 데이터 액세스를 관리합니다.
Provider는 Android 애플리케이션의 일부이며, 대게 데이터 작업을 위한 고유의 UI를 제공합니다.

그러나 Content Provider는 주로 다른 앱에서 사용하도록 설계되며,
이러한 앱은 제공자 Client 객체를 사용하여 제공자에 액세스합니다.

제공자와 제공자 Client는 함께 데이터에 일관된 표준 인터페이스를 제공하고, 프로세스 간 통신과 보안 데이터 액세스도 처리합니다.

일반적으로 두 가지 상황 중 하나에서 Content Provider를 사용합니다.
1. 다른 앱에서 기존 Content Provider에 액세스하기 위한 코드 구현
2. 내 앱에서 새로운 Content Provider를 생성하여 다른 앱과 데이터를 공유

 

내 앱에서 Content Provider를 구현하여 제공하면,

다른 앱들은 Content Resolver를 통해서 내 앱에 구현된 Content Provider에 접근할 수 있습니다.

Content Provider는 DB와 유사하게 query, insert, update, delete 등 API를 호출합니다.

 

🧐 그렇다면 외부에서 연동은 어떻게 할까요?

ContentProvider를 외부에서 호출하려면 ContentResolver를 사용해야합니다.

ContentResolver 객체는 contentResolver 프로퍼티로 획득해 query, insert, update, delete 함수를 호출할 수 있습니다.

외부 앱은 Content Resolver를 통해 Uri를 해당 앱에 보내고, 해당 앱의 Content Provider가 Uri를 해석해 필요한 작업을 하게 됩니다. 이 때 Uri를 전달 받은 Content Provider는 CRUD 연산을 기본적으로 처리하고 작업을 모두 수행 후 결과를 Content Resolver에 반환합니다.

 

Content Provider를 사용하면 현재 제 앱에서 외부앱(갤러리)를 호출해 외부앱(갤러리)의 사진 정보를 가져올 수 있습니다.

Manifest 설정은 생략하겠습니다... 😉

 

우선 전 MainActivity에 다음과 같이 intent를 처리하였습니다.

앱이 단순히 데이터를 읽거나 가져오도록 할 때 ACTION_GET_CONTENT를 사용합니다. (ex: 이미지 파일)

그래서 intent에 ACTION_GET_CONTENT를 사용했습니다.

타입은 image/*로 설정해주었고, 여러 개 선택이 가능하도록 putExtra를 넘겼습니다.

 

그 다음, goGallery를 launch합니다.

Activity Result에 콜백을 받을 수 있는 registerForActivityResult를 사용했습니다.

제가 가상환경에서 촬영한 강아지와 고양이들이 잘 나오는 것을 확인할 수 있었습니다 :)

 

이 화면에서 선택을 완료 했을 때

클립데이터가 존재하면 여러 개의 사진이 온 것이고, 존재하지 않으면 1개의 사진이 온 것입니다.

직접 테스트하면 정상적으로 로그가 찍히는 것을 확인할 수 있었습니다 :D

 

이번엔 Content Resolver를 이용하여 직접 사진들을 가져오는 작업입니다.

우선 권한을 체크하고 허용해줘야 하므로 다음과 같이 코드를 작성합니다.

permission이 허용되어 있지 않으면 Dialog를 생성하여 권한을 허용하게 처리해줬습니다.

 

권한이 허용되어 있으면 checkPermission이 true로 반환되어 getImages()를 호출합니다.

getImages() 에서는 uri와 projection를 세팅 후 contentResolver의 query 파라미터로 넘겨줍니다.

그 다음 cursor를 통해 각각 이미지 정보들을 가져오고 이미지 정보를 Log로 찍어냅니다.

 

마지막으로 정리하자면

외부 앱이 특정 앱의 정보가 필요할 때, 외부 앱은 Content Resolver를 통해 Uri를 해당 앱에 보내고

해당 앱의 Content Provider가 Uri를 해석해 필요한 작업을 합니다.

이 때 Uri를 전달받은 Content Provider는 기본적으로 CRUD 처리 가능하며 필요한 작업을 모두 수행 후 결과값을 Content Resolver에 반환합니다.