상세 컨텐츠

본문 제목

안드로이드/Android 의 (Native) - 미디어 스캐너 사용 방법(MediaScanner)

Android 자료실/기능 개발

by Victorywskim 2024. 1. 7. 15:47

본문

반응형

미디어 스캐너는 안드로이드에서 파일 시스템을 스캔하고, 새로운 미디어 파일(이미지, 동영상, 오디오 등)을 감지하여 시스템의 미디어 라이브러리에 등록하는 시스템 서비스입니다.

 

이를 통해 갤러리 앱이나 미디어 플레이어 같은 앱이 최신의 미디어 파일을 인식할 수 있게 됩니다.

 

미디어 스캐너를 사용하는 방법은 간단합니다.

 

 

// MediaScannerConnection 객체를 생성합니다.
val mediaScannerConnection = MediaScannerConnection(this, object : MediaScannerConnection.MediaScannerConnectionClient {

    // 미디어 스캔이 완료되면 호출됩니다.
    override fun onMediaScannerConnected() {
        // 미디어 스캔이 완료되었음을 알리는 메시지를 표시합니다.
        Toast.makeText(this@MainActivity, "미디어 스캔이 완료되었습니다.", Toast.LENGTH_SHORT).show()
    }

    override fun onScanCompleted(path: String?, uri: Uri?) {
        // 스캔 중인 파일 정보
    }
})

// MediaScannerConnection 객체에 MediaScannerConnectionClient 객체를 설정합니다.
mediaScannerConnection.connect()

// 외부 저장소의 모든 파일을 미디어 스캔합니다.
File("/storage/emulated/0").listFiles()?.also {
    
    // 모든 파일을 미디어 스캔합니다.
    for (file in it) {
        // 파일의 경로를 미디어 스캔합니다.
        mediaScannerConnection.scanFile(file.absolutePath, null)
    }
    
    // jpeg 이미지 파일만 미디어 스캔합니다.
    val mimeType = "image/jpeg"
    for (file in it) {
        if (file.isFile && file.extension in mimeType) {
            mediaScannerConnection.scanFile(file.absolutePath, mimeType)
        }
    }
    mediaScannerConnection.disconnect()
}?:mediaScannerConnection.disconnect()

 

 

위 코드를 사용하시기 전에 다음 코드를 수정해주셔야 합니다.

// 모든 파일을 미디어 스캔합니다.
for (file in it) {
    // 파일의 경로를 미디어 스캔합니다.
    mediaScannerConnection.scanFile(file.absolutePath, null)
}

// jpeg 이미지 파일만 미디어 스캔합니다.
val mimeType = "image/jpeg"
for (file in it) {
    if (file.isFile && file.extension in mimeType) {
        mediaScannerConnection.scanFile(file.absolutePath, mimeType)
    }
}

 

scanFile 을 2번 하고 있는데 모든 파일을 스캔할지, 특정 파일만 스캔할지 판단하시어 필요에 따라 하나만 사용하시면 됩니다.

 

주의 사항

 

  • 스캔 비용
    • 미디어 스캐닝은 시스템 리소스를 소모하는 작업이므로, 불필요한 스캔을 피해야 합니다.
    • 새로운 미디어 파일이 추가되거나 삭제될 때만 스캔을 요청해야 합니다.
  • 퍼미션 체크
    • 외부 저장소에 접근하기 위해서는 적절한 퍼미션을 가지고 있어야 합니다.
    • Manifest 파일에 READ_EXTERNAL_STORAGE 권한을 추가해야 합니다.

 

감사합니다.

 

728x90
반응형

관련글 더보기