제이슨의 개발이야기

안드로이드 앨범 접근 권환 확인 및 이미지 피커 안드로이드 사진첩 본문

안드로이드

안드로이드 앨범 접근 권환 확인 및 이미지 피커 안드로이드 사진첩

제이쓰은 2021. 5. 1. 17:12
728x90
반응형

 

 

안녕하세요 오늘은 그동안 꼭 블로그에 쓰고 싶었던 안드로이드 이미지 피커 (사진첩) 랑 앨범에 접근 할때 접근 권한을 체크하고 권한이 없는 경우 권한을 묻는 부분에 대해서 이야기 해보고자 합니다 ! 

 

일단 이미지 피커 란 무엇인가? 

 

기기 내에 사진첩에 접근해서 자신이 원하는 사진을 선택하는 것을 이미지 피커 라고 합니다 !  구글이나 유튜브에 

안드로이드 이미지 피커 라고 검색하시면 많은 블로그와 영상이 있지만 대부분 다른 사람들이 만들어 놓은 라이브러리를 그대로 사용하는 경우가 많더라구요 ! 물론 남이 잘 만든 라이브러리를  사용해도 상관없지만 커스텀을 해야하는 경우에는 불편하고 자신이 직접 만들어야 커스텀 하기 쉽기 때문에 직접 만드는 것이 더 효율적인 경우도 있습니다 ! 

 

일단 먼저 앨범에 접근하기 전 앨범에 접근 권한이 있는지

확인 해보고 없는 경우 접근 권한을 허용할것인지 묻는 창이 먼저 떠야합니다 

 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

jaeilssss/albumPermissionStudy

사진 권한 받기. Contribute to jaeilssss/albumPermissionStudy development by creating an account on GitHub.

github.com

 

728x90
반응형