[kotlin] 안드로이드 사진 앨범 선택

Leechaeyeon·2023년 7월 18일
0

코틀린 안드로이드

목록 보기
14/21

Mainfest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>

MainActivity.kt

  • 변수 설정
 lateinit var activityMainBinding: ActivityMainBinding

    val permissionList = arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.ACCESS_MEDIA_LOCATION
    )

    lateinit var albumActivityLauncher: ActivityResultLauncher<Intent>

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="앨범에서 가져오기" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       	android:adjustViewBounds="true"
        tools:srcCompat="@tools:sample/avatars" />
</LinearLayout>

MainActivity.kt

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){

        }
        activityMainBinding.run {
            button.setOnClickListener {
                // 앨범에서 사진을 선택할 수 있는 Activity를 실행한다.
                val newIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                // 실행할 액티비티의 마임타입 설정 ( 이미지로 설정한다. )
                newIntent.setType("image/*")
                // 선택할 파일의 타입을 지정 ( 안드로이드 OS가 이미지에 대한 사전 작업을 할 수 있도록 )
                val mimeType = arrayOf("image/*")
                newIntent.putExtra(Intent.EXTRA_MIME_TYPES,mimeType)
                // 액티비티를 실행한다.
                albumActivityLauncher.launch(newIntent)
            }
        }
    }
  • 앨번에서 사진 가져오기 intent
albumActivityLauncher = registerForActivityResult(contract1){
            if(it?.resultCode == RESULT_OK){
                // 선택할 이미지에 접근할 수 있는 Uri 객체를 추출한다.
                val uri = it.data?.data
                // 안드로이드는 영상, 음원, 사진 등의 미디어 파일을 단말기 내무제 저장하면 미디어 스캐너라는 것의 자동으로 가동된다.
                // 미디어 스캐너의 역할은 영상, 음원, 사진 등에 관련된 데이터를 추출하여 SQLiteDatabase에 저장한다.
                // 이 정보를 가져다 사용할 수 있는 컨텐츠 프로바이더를 이용해 정보를 가져온다.
                if(uri != null){
                    // 안드로이드 10 ( Q ) 이상이면
                    if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.Q){
                        // 이미지를 생성할 수 있는 디코더를 생성한다.
                        val source = ImageDecoder.createSource(contentResolver,uri)
                        // 비트맵객체를 생성한다.
                        val bitmap = ImageDecoder.decodeBitmap(source)
                        activityMainBinding.imageView.setImageBitmap(bitmap)
                    }
                } else {
                    // 컨텐츠 프로바이더를 통해 이미지 데이터 정보를 가져온다.
                    val cursor = uri?.let { it1 -> contentResolver.query(it1, 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)
                    }
                }
            }
        }

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

답글 달기

관련 채용 정보