Android 퍼미션을 쉽게 다루기위한 라이브러리가 있기는 한데, 이것조차도 내겐 복잡해보인다.
https://github.com/googlesamples/easypermissions
PermissionHelper 라는 정말 간단한 유틸리티를 클래스를 만들어 보았다.
class PermissionHelper(private val permissions: Array<String>) { private lateinit var grantAction: () -> Unit // should onGranted private var cancelAction: (Boolean) -> Unit = {} fun onGranted(grantAction: () -> Unit): PermissionHelper { this.grantAction = grantAction return this } fun onCancelled(cancelAction: (Boolean) -> Unit): PermissionHelper { this.cancelAction = cancelAction return this } fun check(baseActivity: KotlinBaseActivity) { if (PermissionUtils.checkPermissions(baseActivity, permissions)) { baseActivity.permissionHelper = null grantAction() } else { baseActivity.permissionHelper = this ActivityCompat.requestPermissions(baseActivity, permissions, 100) } } fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray, baseActivity: KotlinBaseActivity) { if (BuildConfig.DEBUG) { assert(requestCode == 100) } val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } if (allGranted) { grantAction() } else { val neverAskAgain = permissions.any { !ActivityCompat.shouldShowRequestPermissionRationale(baseActivity, it) } cancelAction(neverAskAgain) } baseActivity.permissionHelper = null } }
코틀린의 람다를 사용하면 인터페이스를 사용할 필요가 없고, 사용할 때도 직관적으로 구현이 가능하다.
open class KotlinBaseActivity : BaseActivity() { var permissionHelper: PermissionHelper? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.colorPrimary)); } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { permissionHelper?.onRequestPermissionsResult(requestCode, permissions, grantResults, this) ?: super.onRequestPermissionsResult(requestCode, permissions, grantResults) } }
사용할때는 KotlinBaseActivity를 상속하는 activity에서
fun onClickProfileImage(v: View) { PermissionHelper(Const.storagePermissions) .onGranted { PickerUtils.startTakeGalleryPhoto(this) } .check(this) }