wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Challenge

패스트캠퍼스 챌린지 33일차

Kick_snare 2022. 2. 25. 16:15
728x90

33일차

30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online

강의 목표


  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
  • 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.

목차 02 Basic - Ch05. 전자액자


  • 인트로
  • Android기기 권한 받아오기
  • 권한을 통해 사진 가져오기
  • 사진 가져와서 목록 구성하기
  • 액자 화면 구성하기
  • Activity Lifecycle 을 알아보고 완성도 높이기
  • 아웃트로

권한을 통해 사진 가져오기

이전 포스팅에서 requestPermissions() 함수를 통해 권한을 요청하는 코드를 작성하였다.

사용자에게 권한 허가를 요청하여 요청을 받은 후에 이제 결과를 받아오는 부분이다.

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

    when (requestCode) {
        1000 ->  {
            if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                navigatePhotos()

            } else {
                Toast.makeText(this, "권한을 거부하셨습니다", Toast.LENGTH_SHORT)
            }
        }
        else -> {}
    }
}

보낸 요청코드에 대해서 결과값을 가져오고 그에 대한 처리를 해주어야한다

3번째 인자는 granted로 결과 확인을 하고 사진을 가져오는 함수를 만들어보자

navigatePhotos() 라는 함수로 SAF 기능을 이용하여 사용자에게 사진을 가져오는 동일한 환경을 제공해주도록하자.

이를 활용하면 매우 간단하게 사진들에 접근 가능하다

private fun navigatePhotos() {
    val intent = Intent(Intent.ACTION_GET_CONTENT)
    intent.type = "image/*" // 모든 이미지 타입을 가져옴 (필터링)
    startActivityForResult(intent, 2000)
}

사진 가져와서 목록 구성하기

위 navigatePhoto 함수에서 intent를 생성하고 새로운 액티비티를 실행하면서 intent를 넘겨준다.

위 명령에 따른 핸들러를 짜서 사진을 추가해보자

먼저 사진 Uri를 추가하기 위한 리스트가 필요하다

private val imageUriList : MutableList<Uri> = mutableListOf()

로컬 사진 Uri 가 리스트로 저장될 것이다.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(resultCode != Activity.RESULT_OK) return
    // 취소를 했다면 Not OK -> 예외처리 해

    when(requestCode) {
        2000 -> {
            val selectedImageUri : Uri? = data?.data

            if (selectedImageUri != null) {

                if(imageUriList.size >= 6) {
                    Toast.makeText(this, "이미 사진이 꽉 찼습니다.", Toast.LENGTH_SHORT).show()
                    return
                }
                imageUriList.add(selectedImageUri)
                imageViewList[imageUriList.size - 1].setImageURI(selectedImageUri)
            } else {
                Toast.makeText(this, "사진을 가져오기 못했습니다.", Toast.LENGTH_SHORT).show()
            }

        } else -> {
            Toast.makeText(this, "사진을 가져오기 못했습니다.", Toast.LENGTH_SHORT).show()
        }
    }
}

액티비티를 넘김에 따른 핸들러 코드이다

먼저 resultCode가 OK이지 않으면 뭔가 문제가 있다는 뜻임으로 예외처리해준다

그리고 액티비티를 시작하며 넘겼던 코드 2000의 경우 사진을 추가하는 액션을 추가해주면 된다.

SAF로 선택한 사진의 URI 데이터는 3번째 인자 data에 담기고, Nullcheck를 통해 selectedUri에 추가한다.

imageUriList에 저장하고,

사이즈를 인덱스로 하여 imageViewList 의 실질적인 보여주는 부분의 이미지를 설정해준다

처음 뷰를 설계할 때 6개까지 만들었으므로 6개 이상 선택하지 못하도록 예외처리 해주었다.


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

수강인증샷

링크

https://bit.ly/37BpXiC

 

 

 

 

 

 

728x90