본문 바로가기
안드로이드/코틀린

안드로이드 startActivityForResult의 대체

by 나이아카 2022. 4. 24.

 안드로이드는 항상 새 바람이 부는 것 같습니다. 사실 이 주제로 글을 쓰면서 새 바람이 분다고 얘기하면 뭔 뒷북이냐 하실 수도 있겠지만... 자그마치 제가 이 블로그에 첫 글로 올렸던 권한 관련 액티비티 구성에 startAcitivtyForResult를 사용해서 권한 허용 관련 글을 썼었거든요. 그게 이제 아예 deprecated되다 보니 다른 것들로 대체할 게 필요했고, 이번 글에서는 그것에 대해서 알아볼 예정입니다.


 startActivityForResult의 대체는 registerForActivityResult()로 이루어지는데요. 대체된 코드로 작성하고 나면, 이전에 비해 훨씬 간결하고 깔끔해진 코드를 볼 수 있습니다. 먼저 어떤식으로 구현되는지 코드를 통해 알아보겠습니다.

    val permissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            if (it) {
                //권한을 허용한 경우
            } else {
                //권한을 허용하지 않은 경우
                //앱 설정 화면으로 이동하게 만들자
                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                //activity에서 쓰는 경우 this.packageName으로 열 수 있음
                //앱 설정 화면으로 이동하는 intent
                requireActivity().packageName.also { name ->
                    val uri = Uri.fromParts("package", name, null)
                    intent.data = uri
                }
                settingsActionReqLauncher.launch(intent)
            }
        }
        
    val settingsActionReqLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            //startActivityForResult의 대체로 intent에서 이동한 화면에서 빠져 나왔을 때
            //동작할 코드 작성
            val permissionCheck =
                requireActivity().checkSelfPermission()
            //여기서는 권한 허용이 되었는지 파악하기 위한 코드이기 때문에 permissionCheck를 이용    
            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                //퍼미션 체크가 완료된 경우
                
            }
        }

 먼저 위의 코드를 보면 permissionLauncher가 있는데, 이 친구는 permission을 파라미터로 받아 실행하는 경우 권한 실행 창을 띄우고 그 권한을 허용했는지 아닌지에 따라 boolean 타입을 반환합니다. 그 변수는 it이나 자신이 특정한 변수명으로 사용이 가능합니다.

 그 조건이 true인지 false인지에 따라 원하는 플로우를 태워서 실행해주시면 됩니다. 그 다음은 settingsActionReqLauncher인데, 이 친구가 진짜 startActivityForResult()를 대체하는 액션입니다. 여기서 기존에 사용하던 startActivityForResult() 코드를 복붙하면 동일하게 실행이 됩니다. 또한 startActivityForResult를 불러오는 코드는 permissionLauncher에 있는 settingsActionReqLauncher.launch(intent) 처럼 intent를 생성하는 코드에 대체하는 형식으로 작성할 수 있습니다.

permissionLauncher.launch(PERMISSIONS_REQUESTED)

private val PERMISSIONS_REQUESTED: Array<String> = arrayOf(
        android.Manifest.permission.CAMERA,
        android.Manifest.permission.ACCESS_COARSE_LOCATION,
        android.Manifest.permission.CALL_PHONE,
        android.Manifest.permission.RECORD_AUDIO
)

 이 권한 런처는 이런식으로 여러가지 권한을 한 번에 확인하도록 실행시킬 수 있습니다. 더욱이 이 런처를 통해 실행시키게 되면 권한을 이미 허용했는지 하지 않았는지 파악할 필요 없이 내부적으로 이미 허용된 권한이라면 바로 런처의 콜백 메소드를 실행시켜 줍니다.


 코드가 엄청 간결해졌다는 것을 알 수 있습니다. 이것들을 잘 응용하면 생각보다 더 간단하게 코드를 작성할 수도 있기도 합니다. 이 코드조차 나온지 꽤 된 코드라는 것을 생각하면 확실히 안드로이드는 변화가 빠른 프레임워크가 아닌가 생각이 됩니다.

댓글