안드로이드 개발자의 창고
[52일차 Android] 앨범에서 사진 가져오기 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 앨범에서 사진 가져오기
- 앨범에서 사진을 가져올 때 다른 Activity를 실행시켜서 사진을 가져올 수 있다.
- Intent.ACTION_PICK
예제 코드
AndroidManifest.xml
...
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
</manifest>
MainActivity.kt
- 안드로이드는 영상, 음원, 사진 등의 미디어 파일을 단말기 내부에 저장하면 미디어 스캐너라는 것이 자동으로 가동된다.
- 미디어 스캐너의 역할은 영상, 음원, 사진 등에 관련된 데이터를 추출하여 SQLiteDatabase에 저장한다.
- 이 정보를 가져다 사용할 수 있는 Content Provider를 이용해 정보를 가져온다.
- 안드로이드 버전이 10(Q) 이상이면 Content Resolver로 바로 접근 가능하다.
- 10 버전 이하이면 Contetnt Provider를 통해 이미지 경로를 가져와 접근해야 한다.
콘텐츠 제공자 기본 사항 | Android 개발자 | Android Developers
콘텐츠 제공자 기본 사항 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 콘텐츠 제공자는 중앙 저장소로의 데이터 액세스를 관리합니다. 제공자는 Android 애
developer.android.com
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
// 확인할 권한 목록
val permissionList = arrayOf(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_MEDIA_LOCATION
)
lateinit var albumActivityLauncher : ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
// 권한 확인
requestPermissions(permissionList, 0)
val contract1 = ActivityResultContracts.StartActivityForResult()
albumActivityLauncher = registerForActivityResult(contract1){
if(it?.resultCode == RESULT_OK){
// 선택한 이미지에 접근할 수 있는 Uri 객체를 추출한다.
val uri = it.data?.data
if (uri != null){
// 안드로이드 10(Q) 이상이라면
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
// 이미지를 생성할 수 있는 디코더를 생성한다.
val source = ImageDecoder.createSource(contentResolver, uri)
// Bitmap객체를 생성한다.
val bitmap = ImageDecoder.decodeBitmap(source)
// 메인 화면의 imageView에 해당 이미지를 설정한다.
activityMainBinding.imageView.setImageBitmap(bitmap)
} else {
// Content Provider를 통해 이미지 데이터 정보를 가져온다.
val cursor = contentResolver.query(uri,null,null,null,null)
if(cursor != null) {
cursor.moveToNext()
// 이미지의 경로를 가져온다.
val idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA)
val source = cursor.getString(idx)
// 이미지를 생성하여 보여준다.
val bitmap = BitmapFactory.decodeFile(source)
activityMainBinding.imageView.setImageBitmap(bitmap)
}
}
}
}
}
activityMainBinding.run {
button.setOnClickListener {
// 앨범에서 사진을 선택할 수 있는 Activity를 실행한다.
val newIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
// 실행할 액티비티의 MIME 타입 설정(이미지로 설정)
newIntent.setType("image/*")
// 선택할 파일의 타입을 지정(안드로이드 os가 이미지에 대한 사진 작업을 할 수 있도록)
val mineType = arrayOf("image/*")
newIntent.putExtra(Intent.EXTRA_MIME_TYPES, mineType)
// 액티비티 실행
albumActivityLauncher.launch(newIntent)
}
}
}
}
'Computer > Android' 카테고리의 다른 글
[Android] MVVM (0) | 2023.08.24 |
---|---|
[52일차 Android] Socket 통신 (0) | 2023.07.27 |
[52일차 Android] 사진 촬영하기 (0) | 2023.07.24 |
[51일차 Android] Location (0) | 2023.07.20 |
[52일차 Android] Sensor (0) | 2023.07.20 |