본문 바로가기

안드로이드/4대 컴포넌트

[안드로이드] Content Provider

Content Provider는 애플리케이션의 데이터를 액세스하고, 다른 애플리케이션과 공유하는 기능을 제공한다.

Content Provider는 자체적인 보안 시스템이 적용되어 있으며, 사용자 권한을 요구하여 내부적으로 데이터를 보호한다.

만약 요청하는 애플리케이션에 필요한 권한이 없으면 Content Provider의 데이터에 접근할 수 없다.

 

Content Provider의 대표적인 예로는 사진첩 또는 연락처 등을 접근할 때 사용된다.

 

안드로이드 공식문서

https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ko

 

콘텐츠 제공자 기본 사항  |  Android 개발자  |  Android Developers

콘텐츠 제공자 기본 사항 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 콘텐츠 제공자는 중앙 저장소로의 데이터 액세스를 관리합니다. 제공자는 Android 애

developer.android.com

 

사용 방법

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

 

공유 저장소의 미디어 파일에 액세스  |  Android 개발자  |  Android Developers

DataStore는 로컬 데이터를 저장하는 최신 방법을 제공합니다. SharedPreferences 대신 DataStore를 사용해야 합니다. 자세한 내용은 DataStore 가이드를 참고하세요. 공유 저장소의 미디어 파일에 액세스 컬

developer.android.com

 

'안드로이드 > 4대 컴포넌트' 카테고리의 다른 글

[안드로이드] BroadCast Receiver  (0) 2024.01.18