포트폴리오

[소개] FMCheckPermission (Android Library : Permission Checker)

freemmer 2019. 1. 16. 10:03

FMCheckPermission 는 ‘앱 권한 획득’을 쉽게 구현할 수 있도록 도와주는 라이브러리 입니다.

Github URL : https://github.com/freemmer/FMCheckPermission

  • Platform             : Android
  • Language             : Kotlin
  • Type                 : Library 
  • Support SDK Version  : 19+



안드로이드 6.0 Marshmallow 부터는 이전 버전의 관리와 다르게 변경되었습니다.
기존에는 AndroidManifest.xml에 권한 설정을 넣는 것으로 끝났지만(설치시에 권한이 표시됩니다), 6.0 부터는 설치시 권한을 물어보지 않고 권한에 해당하는 기능을 사용시 iOS와 유사하게 팝업으로 물어보도록 변경되었습니다.



# 사용방법

Project build.gradle 에 아래 항목을 추가합니다.
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
App build.gradle 에 아래 항목을 추가합니다.
현재 최신 버전은 1.1.0 입니다. https://github.com/freemmer/FMCheckPermission 에서 최신 버전을 확인 하실 수 있습니다.
dependencies {
...
implementation 'com.github.freemmer:FMCheckPermission:1.2.0'
}
아래 클래스와 같이 Permission Check를 할 Activity에 FMCheckPermissionActivity를 상속받고 사용합니다.
Activity의 종류는 다음과 같습니다.
  • FMCheckPermissionActivity            : Activity를 상속 받음
  • FMCheckPermissionAppCompatActivity   : AppCompatActivity를 상속 받음
  • FMCheckPermissionAppFragmentActivity : FragmentActivity를 상속 받음
class MainActivity : FMCheckPermissionActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
btnCheckPermission.setOnClickListener {
checkPermission(arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CONTACTS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.SYSTEM_ALERT_WINDOW
))
}
btnCheckPermissionSystemAlertWindow.setOnClickListener {
checkPermission(arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_CONTACTS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.SYSTEM_ALERT_WINDOW
), this.packageName)
}
}
override fun onRequestPermissionRationale(permissions: List<String>) {
Log.d(MainActivity::class.java.simpleName
, "Request Permission Rationale(In case. checked 'Don't ask again') : $permissions")
Snackbar
.make(btnCheckPermission, "Request Permission Rationale(In case. checked 'Don't ask again') : $permissions"
, Snackbar.LENGTH_LONG)
.setAction("move setting") { moveSetting(this.packageName) }
.show()
}
override fun onDeniedRequestPermission(permissions: List<String>) {
Log.d(MainActivity::class.java.simpleName, "Denied Request Permission : $permissions")
Snackbar
.make(btnCheckPermission, "Denied Request Permission : $permissions", Snackbar.LENGTH_SHORT)
.show()
}
override fun onGrantedRequestPermission() {
Log.d(MainActivity::class.java.simpleName, "Granted Request Permission")
Snackbar
.make(btnCheckPermission, "Granted Request Permission", Snackbar.LENGTH_SHORT)
.show()
}
override fun onDeniedSystemAlertWindow() {
Log.d(MainActivity::class.java.simpleName, "Denied SystemAlertWindow")
Snackbar
.make(btnCheckPermission, "Denied SystemAlertWindow", Snackbar.LENGTH_SHORT)
.show()
}
override fun onGrantedSystemAlertWindow() {
Log.d(MainActivity::class.java.simpleName, "Granted SystemAlertWindow")
Snackbar
.make(btnCheckPermission, "Granted SystemAlertWindow", Snackbar.LENGTH_SHORT)
.show()
}
}
혹은 아래와 같이 FMICheckPermission를 상속받아 직접 구현하실 수도 있습니다.
abstract class FMCheckPermissionActivity: Activity(), FMICheckPermission {
private lateinit var checker: FMCheckPermission
private fun checkLateInit() {
if (!this::checker.isInitialized) {
checker = FMCheckPermission(this, this)
}
}
fun checkPermission(permissions: Array<String>, packageName: String?) {
checkLateInit()
checker.execute(permissions, packageName)
}
fun moveSetting(packageName: String) {
checkLateInit()
checker.moveSetting(packageName)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
checker.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
checker.onActivityResult(requestCode, resultCode, data)
}
}


반응형