제이슨의 개발이야기
안드로이드 앨범 접근 권환 확인 및 이미지 피커 안드로이드 사진첩 본문
안녕하세요 오늘은 그동안 꼭 블로그에 쓰고 싶었던 안드로이드 이미지 피커 (사진첩) 랑 앨범에 접근 할때 접근 권한을 체크하고 권한이 없는 경우 권한을 묻는 부분에 대해서 이야기 해보고자 합니다 !
일단 이미지 피커 란 무엇인가?
기기 내에 사진첩에 접근해서 자신이 원하는 사진을 선택하는 것을 이미지 피커 라고 합니다 ! 구글이나 유튜브에
안드로이드 이미지 피커 라고 검색하시면 많은 블로그와 영상이 있지만 대부분 다른 사람들이 만들어 놓은 라이브러리를 그대로 사용하는 경우가 많더라구요 ! 물론 남이 잘 만든 라이브러리를 사용해도 상관없지만 커스텀을 해야하는 경우에는 불편하고 자신이 직접 만들어야 커스텀 하기 쉽기 때문에 직접 만드는 것이 더 효율적인 경우도 있습니다 !
일단 먼저 앨범에 접근하기 전 앨범에 접근 권한이 있는지
확인 해보고 없는 경우 접근 권한을 허용할것인지 묻는 창이 먼저 떠야합니다
add.setOnClickListener { when{ ContextCompat.checkSelfPermission( this, android.Manifest.permission.READ_EXTERNAL_STORAGE )==PackageManager.PERMISSION_GRANTED ->{ // 권한이 잘 부여 되었을 때 갤러리에서 사진을 선택하는 기능 navigatesPhotos() } shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE)->{ // 교육용 팝 확인 후 권한 팝업 띄우는 기능 showContextPopupPermission() } else ->{ requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),1000) } } } }
위에 코드는 사진 추가하기 버튼을 눌렀을때 먼저 권한이 있는지 확인 하고 권한이 없는 경우 권한을 허용할 것인지 묻는 코드 입니다
주석을 보시면 // 권한이 부여 된 부분은 navigatePhotos() 메소드를 실행하여 이미지 선택 하는 창으로 넘어가는 부분이고
shouldShow....부분에서 // 교육용 팝업을 띄우고 권한 팝업 띄우는 기능 이 부분은 예전에 권한을 허용하지 않기 를 눌렀을 경우 showContextPopupPermission() 메소드를 실행하는 부분입니다 !
private fun navigatesPhotos(){ val intent = Intent(this,imagePickerActivity::class.java) startActivityForResult(intent,2000) }
fun showContextPopupPermission(){ AlertDialog.Builder(this).setTitle("권한이 필요합니다") .setMessage("사진을 불러오기 위해 권한이 필요합니다") .setPositiveButton("동의하기") { _, _ -> requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),1000) } .setNegativeButton("취소하기") { _, _ ->} .create() .show() }
그리고 마지막 else{ 부분은 requestPermissions 를 호출하여 접근 권한을 줄지 묻는 창을 띄웁니다
else 부분은 사용자가 해당 앱을 처음 으로 설치하고 처음으로 앨범 접근을 할때 실행되는 부분입니다
여기서 중요한 점은 접근 권한을 부여할지 말지 묻는 창 은 requestPermissions(arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),1000)
입니다 이 메소드를 호출하면 우리가 알고 있는 권한 부여에 대한 메시지 창이 뜹니다 !
권한이 있는 것을 확인하고 이미지 선택창으로 넘어 갔을 때 해당 기기네에 사진이 저장되어있는 주소들을 가지고 와야합니다
이부분은 아래의 코드 입니다
fun getGalleryPhotos( context : Context) : ArrayList<String>{ var pictures = ArrayList<String>() var uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI var colums = arrayOf(MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID) val orderBy = MediaStore.Images.Media._ID var cursor = context.contentResolver.query(uri,colums,null,null,orderBy) if(cursor !=null && cursor.count>0){ while(cursor.moveToNext()){ var indexPath = cursor.getColumnIndex(MediaStore.MediaColumns.DATA) list.add(cursor.getString(indexPath)) } }else{ Log.e("getGalleryPhotos","error") } pictures.reverse() return pictures }
사진이 저장되어있는 path 들을 가지고 오는 메소드 입니다
while() 위의 코드들은 사진들을 가지고 오기 위한 세팅이고
while(){} 에서 기기내에 저장되어있는 사진에 수 만큼 반복해서 가지고 와서 return 합니다 !
해당 프로젝트는 위의 코드 말고도 Recycler View 부분도 있고 Glide 라이브러리를 사용하는 부분도 존재합니다 그러나 블로그에서는 생략하고
백분의 불여일견 이라는 말이 있습니다 제가 설명을 잘 못해서 잘 이해 하지 못하시는 분들이 많을거 같은대 제 깃헙 에 들어가서 해당 프로젝트 코드를 한번 보세요 !!
github.com/jaeilssss/albumPermissionStudy
'안드로이드' 카테고리의 다른 글
[안드로이드] 축복 터지는 타이머(Timer) 만들기 Sound Pool ,seekBar, CountDownTimer,Lottie Animation (0) | 2021.05.11 |
---|---|
Lottie 라이브러리 활용한 안드로이드 Lottie 애니메이션 적용하기 ! 로딩화면 구현 , 버튼 눌렀을때 애니메이션 (0) | 2021.05.03 |
[안드로이드] LiveData Component 예제코드(feat MVVM,Recycler View) (0) | 2021.04.27 |
초보 알고리아(algolia) 검색 엔진 API 사용해보기!! 파이어베이스 검색기능 알고리아로?? with 코틀린 (0) | 2021.04.22 |
[안드로이드 코틀린] 코루틴을 이용해서 파이어베이스 동기 처리하기! (0) | 2021.04.15 |