ContentProivider는 안드로이드 앱을 구성하는 4대 구성요소 중 하나로 다른 앱의 데이터에 접근이 필요할 때 사용하게 되는 컴포넌트이다.
일반적으로 각 앱은 하나의 프로세스로 실행되며 자신의 프로세스에서 사용하는 데이터는 자신만 접근가능하도록 되어 있지만 다른 앱의 데이터 접근이 필요한 경우에 ContentProivider를 통해 접근을 할 수 있다.

예를 들어 사진첩에 있는 사진들을 가져오거나 연락처에 있는 연락처 정보들을 가져와야할 경우가 있다. 이 때 사진 앱에는 ContentProvider가 구현되어 있어 해당 앱의 데이터를 나의 앱에서 사용할 수 있도록 통로를 제공해준다.
일반적으로 다음과 같이 두 가지 경우에서 주로 ContentProvider를 사용한다.
Content Provider는 안드로이드의 컴포넌트 중에서 유일하게 Intent를 발생하지 않고 필요한 순간 시스템에서 자동으로 생성한다.
ContentProvider를 상속받은 클래스에는 onCreate, getType, query, insert, update, delete 함수를 override 해주어야한다.
onCreate 함수는 시스템이 ContentProvider 객체를 생성할 때 자동으로 호출하는 함수이고 query, insert, update, delete 함수는 데이터를 조작하는데 이용되는 함수이다.
class MyContentProvider: ContentProvider() {
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int { }
override fun getType(uri: Uri): String? { }
override fun insert(uri: Uri, values: ContentValues?): Uri? { }
override fun onCreate(): Boolean { }
override fun query(
uri: Uri, projection: Array<out String>?, selection: String?,
selectionArgs: Array<out String>?, sortOrder: String?
): Cursor? { }
override fun update(
uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array<out String>?
): Int { }
}
Content Provider는 컴포넌트이기 때문에 manifest.xml 파일에 등록을 해주어야한다. 이때 Content Provider는 다른 컴포넌트들과는 다르게 android:authorities 속성을 추가해주어야한다.
이 속성은 Content Provider의 ID와 같은 역할을 한다. 다른 앱에서 내 앱의 Provider를 찾을 때 authority를 알고 있어야한다.
그리고 android:permission 속성을 정의하지 않으면 내 앱만 Content Provider에 접근할 수 있다.
퍼미션을 설정하면, 이 퍼미션을 갖고 있는 앱만 내 앱의 ContentProvider에 접근할 수 있다.
또한 android:exported 속성은 외부 접근 허용 여부 옵션이다. 따라서 Content Provider를 외부에서 이용하기 위해서는 이 옵션이 반드시 true로 설정해주어야한다.
안드로이드 4.1 이하 버전에서는 별도의 옵션 처리 없이도 ContentProvider는 항상 외부로 공개 되었으나, 4.2 이상 버전에서는 보안성 개선을 위해 디폴트로 ContentProvider는 공개 되지 않으므로 개발자는 exported 옵션을 true로 지정하여 명시적으로 공개해야 한다.
<provider
android:name=" MyContentProvider"
android:authorities="com.example.provider"
android:enabled="true"
android:exported="true">
</provider>