안드로이드 추상 클래스 이용한 퍼미션 권한 설정. 2-2
에서 만든 java 소스를 코틀린으로 변환 수정
BaseActivity.kt
//////////////////////////////////////////////////////////////////////////////////////////
abstract class BaseActivity : AppCompatActivity() {
abstract val setLayout: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(setLayout)
}
private val PERMISSION_REQUEST: Int = 1000
/**인터페이스 등록.*/
interface PermissionCheckListener {
fun permissionCheckFinish()
}
/**클래스 내 사용할 퍼미션 체크 리스너 (setter 구현 방법이 특이함.)
* 온 크레딧 바로 아래 생성 되어야 한다
* */
lateinit var permissionCheckListener: PermissionCheckListener
/**
* 스트링 배열로 퍼미션 체크.
*/
fun permissionCheck(strings: Array<String>): Boolean {
// 변수 사용시 리턴 타입 지정.
// var check = false
// 변수 사용안하고 바로 리턴시켜 버림.
//안드로이드 마시멜로 이후 퍼미션 체크.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (i in 0 until strings.size) {
if (ContextCompat.checkSelfPermission(this, strings[i]) == PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions(this, strings, PERMISSION_REQUEST)
// check = true
// break
return true
}
}
}
//return check
return false
}
/**
* 거부를 했을때 처리
* 다시보지 않기 체크 후 거부를 하면 설정에서 권한을 허용하도록 요청.
* 허용하지 않을 경우 앱 사용 을 못함..
* 처리를 잘못하면 무한 반복할 경우가 생김.
*/
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST) {
//안드로이드 마시멜로 이후 퍼미션 체크.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (i in grantResults.indices) {
if (grantResults[i] == 0) {
if (grantResults.size == i + 1) {
permissionCheckListener?.permissionCheckFinish()
}
} else {
// 거부한 이력이 있으면 true를 반환한다.
if (shouldShowRequestPermissionRationale(permissions[i])) {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST)
} else {
AlertDialog.Builder(this)
.setTitle("다시보지않기 클릭.")
.setMessage(permissions[i] + " 권한이 거부되었습니다 설정에서 직접 권한을 허용 해주세요.")
.setNeutralButton("설정") { dialog, which ->
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)
Toast.makeText(applicationContext, "권한 설정 후 다시 실행 해주세요.", Toast.LENGTH_SHORT).show()
finish()
}
.setPositiveButton("확인") { dialog, which ->
Toast.makeText(applicationContext, "권한 설정을 하셔야 앱을 사용할 수 있습니다.", Toast.LENGTH_SHORT)
.show()
finish()
}
.setCancelable(false)
.create().show()
}// shouldShowRequestPermissionRationale /else
} // 권한 거절
} // for end
}//Build.VERSION.SDK_INT end
}//requestCode end
}
}
//////////////////////////////////////////////////////////////////////////////////////////
MainActivity에서 사용 방법.
Manifest에
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
퍼미션 등록 확인.
MainActivity.kt
//////////////////////////////////////////////////////////////////////////////////////////
class MainActivity : BaseActivity() {
override val setLayout = R.layout.activity_main
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
permissionCheckListener = object : PermissionCheckListener {
override fun permissionCheckFinish() {
Log.e("log", "start Activity")
}
}
if (permissionCheck(arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
return
}
permissionCheckListener?.permissionCheckFinish()
}
}
//////////////////////////////////////////////////////////////////////////////////////////
'Kotlin > source code' 카테고리의 다른 글
안드로이드 코틀린 리사이클러뷰 아답터 구글예제 (0) | 2019.04.24 |
---|---|
코디네이터레이아웃 스크롤시 터치 오류 (0) | 2018.10.17 |
코틀린 리사이클러뷰 예제. (0) | 2018.10.15 |