마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

갤러리에서 사진을 하나 선택하여 작업을 할때 Mediastore의 역할을 알고싶습니다.

0 추천

안녕하세요. 갤러리 앱에서 선택한 사진을 이용하는 부분이 왜 그렇게 동작하는지 감이 잡히지 않아 글을 작성하게 되었습니다.

(참고한 코드입니다.)

lateinit var filePath: String
override fun onCreate(savedInstanceState: Bundle?) {
    ...
    
    tv_view_pictures.setOnClickListener {
        val intent = Intent(Intent.ACTION_PICK)
        intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        intent.setType("image/*")
        startActivityForResult(intent, 1)
    }
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode == 1) {
        val uri: Uri = data!!.data!!
        filePath = getImageFilePath(uri)
    }
}
fun getImageFilePath(contentUri: Uri): String {
    var columnIndex = 0
    val projection = arrayOf(MediaStore.Images.Media.DATA)
    val cursor = contentResolver.query(contentUri, projection, null, null, null)

    if (cursor!!.moveToFirst()) {
        columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
    }
    return cursor.getString(columnIndex)
}


1. 기본 카메라로 찍은 사진은 기본적으로 내부저장소에 저장이 될텐데 그 장소가 Mediastore인가요?
(Mediastore가 안드로이드 시스템에서 제공하는 미디어  DB라는 글을 보고 이렇게 생각하였습니다.)
만약 아니라면 개별 앱 공간이 아닌 내부저장소의 공용부분에 저장되는 파일에 접근하기위해서 외부저장소의 미디어파일에 접근하기위한 Mediastore가 사용되는 이유를 알고싶습니다.


2. 위 코드를 처리하기위해서는 android.permission.READ_EXTERNAL_STORAGE를 추가해줘야 했습니다.
내부저장소에 접근하는데 왜 외부저장소 퍼미션을 받아야 하는지 모르겠습니다. 
혹시 EXTERNAL가 의미하는것이 안드로이드 플랫폼 내부/외부 공간이 아니라
해당 앱의 할당공간을 제외한 전체를 의미하는것인가요?


3. 다른 앱의 파일에 접근할때 과정이

============================================================
content resolver를 통해 uri를 욉 앱의 content provider에게 전달
->  content provider는 uri를 해석하여 해당 앱의 DB에 필요한 작업을 수행
-> content resolver에게 결과 반환
============================================================

인것으로 알고있습니다. 위 코드 또한 이런 과정으로 처리하는것으로 보이는데

============================================================
A라는 앱에서 갤러리  앱을 실행시켜 사진을 고르면 사진파일에 대한 uri를 반환받고
(내부적으로 갤러리의 content provider가 A의 content resolver로 데이터 반환)
A는 넘겨받은 uri를 다시 갤러리의 content provider에 전달하여 파일의 절대경로가 포함된 cursor객체를
반환받고 이 객체에서 파일의 절대경로를 추출해 사용.
============================================================

이런 과정을 거치는게 맞나요? 맞다면 1번 질문과 연관해서 Mediastore가 어는 부분에 사용되는것인지
알고싶습니다.

위 내용들을 계속 찾아보고 있지만 명확하게 정리되지 않아 글을 올립니다...

Uretan (220 포인트) 님이 2020년 11월 30일 질문
Uretan님이 2020년 11월 30일 수정

1개의 답변

+1 추천
 
채택된 답변
Google IO 19 비디오을 보면 자세하게 설명해 주고 있네요. https://youtu.be/3EtBw5s9iRY?t=53

내 앱만 접근할 수 있는  저장소를 internal storage, 그 외에는 external storage가 되고,  external storage는 공유될 수 있기 때문에 permission을 얻어야 합니다.
spark (224,800 포인트) 님이 2020년 11월 30일 답변
Uretan님이 2020년 11월 30일 채택됨
...