Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[52일차 Android] 앨범에서 사진 가져오기 본문

Computer/Android

[52일차 Android] 앨범에서 사진 가져오기

Wise-99 2023. 7. 24. 19:09

 

 

 

출처 : 안드로이드 앱스쿨 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