Content Provider는 애플리케이션의 데이터를 액세스하고, 다른 애플리케이션과 공유하는 기능을 제공한다.
Content Provider는 자체적인 보안 시스템이 적용되어 있으며, 사용자 권한을 요구하여 내부적으로 데이터를 보호한다.
만약 요청하는 애플리케이션에 필요한 권한이 없으면 Content Provider의 데이터에 접근할 수 없다.
Content Provider의 대표적인 예로는 사진첩 또는 연락처 등을 접근할 때 사용된다.
안드로이드 공식문서
https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ko
사용 방법
1. Manifest
- 저장소에 접근 가능한 권한 부여
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 권한 허용 체크
private fun checkPermission(){
val permissionArray =
arrayOf(
// 권한 리스트
READ_EXTERNAL_STORAGE
)
if (permissionArray.all {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED} &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(permissionArray, 1000)
}
}
3. Gallery
private fun getGallery(): ArrayList<String> {
val fileList = ArrayList<String>()
val url = MediaStore.Images.Media.EXTERNAL_CONTENT_URI // 외부 저장소
val projection = arrayOf(
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_TAKEN
)
val cursor = this.contentResolver.query(
url, // ContentProvider가 관리하는 uri
projection, // Select
null, // Where
null, // selection으로 지정한 칼럼명의 조건을 설정
null // OrderBy
)
if (cursor != null) {
while (cursor.moveToNext()) {
val columnIndex = cursor.getColumnIndex(
MediaStore.Images.Media.DATA
)
val filePath = cursor.getString(columnIndex)
fileList.add(filePath)
Log.e("Cursor", filePath)
}
cursor.close()
}
return fileList.reversed() as ArrayList<String>
}
결과 값 로그
4. Album
private fun getAlbum(): ArrayList<String> {
val folderMap: MutableMap<String, String> = TreeMap()
val url = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID
)
val cursor = this.contentResolver.query(
url, // ContentProvider가 관리하는 uri
projection, // Select
null, // Where
null, // selection으로 지정한 칼럼명의 조건을 설정
null // OrderBy
)
if (cursor != null) {
while (cursor.moveToNext()) {
val columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
val folder = cursor.getString(columnIndex)
try {
if (folderMap[folder] == null) folderMap[folder] = folder
}
catch (e: Exception) { }
}
cursor.close()
}
return java.util.ArrayList<String>(folderMap.values)
}
결과 값 로그
* MediaStore 관련 공식 문서
https://developer.android.com/training/data-storage/shared/media?hl=ko
'안드로이드 > 4대 컴포넌트' 카테고리의 다른 글
[안드로이드] BroadCast Receiver (0) | 2024.01.18 |
---|