Seize the day

POST : Android Dev Study

Android 퍼미션 쉽게 요청하기

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)

    }


top

posted at

2017. 12. 2. 20:11


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크