본문 바로가기
카테고리 없음

<Kotlin 코틀린> 안드로이드 WebView(웹뷰) 갤러리 사진 registerForActivityResult으로 넘겨주기

by 일용직 코딩노동자 2021. 11. 10.
728x90
반응형

onShowFileChooser 를 오버라이드 해주시면 되는데요!

 

그전에 우선 변수먼저 전역으로 잡고 갈거 선언해주고 가겠습니다.

 

var cameraPath = ""
var mWebViewImageUpload: ValueCallback<Array<Uri>>? = null

이렇게 선언 잡아주시고

 

웹뷰이름.webChromeClient = object : WebChromeClient(){
override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?, fileChooserParams: FileChooserParams?): Boolean {
                try{
                    mWebViewImageUpload = filePathCallback!!
                    var takePictureIntent : Intent?
                    takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                    if(takePictureIntent.resolveActivity(packageManager) != null){
                        var photoFile : File?

                        photoFile = createImageFile()
                        takePictureIntent.putExtra("PhotoPath",cameraPath)

                        if(photoFile != null){
                            cameraPath = "file:${photoFile.absolutePath}"
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile))
                        }
                        else takePictureIntent = null
                    }
                    val contentSelectionIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                    contentSelectionIntent.type = "image/*"

                    var intentArray: Array<Intent?>

                    if(takePictureIntent != null) intentArray = arrayOf(takePictureIntent)
                    else intentArray = takePictureIntent?.get(0)!!

                    val chooserIntent = Intent(Intent.ACTION_CHOOSER)
                    chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent)
                    chooserIntent.putExtra(Intent.EXTRA_TITLE,"사용할 앱을 선택해주세요.")
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray)
                    launcher.launch(chooserIntent)
                }
                catch (e : Exception){ }
                return true
            }
        }

이 구문을 복붙해주시면 될거같은데요. 

 

여기서 빨간줄 뜨시는분들 많으실겁니다.

 

이제 여기서 사용한 다른것들 셋팅해줄게요.

 

fun createImageFile(): File? {
        @SuppressLint("SimpleDateFormat")
        val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val imageFileName = "img_" + timeStamp + "_"
        val storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(imageFileName, ".jpg", storageDir)
    }

우선 createImageFile 먼저 만들어 주시구요.

 

원래는 startActivityForResult 이용해서

onActivityResult  오버라이드 해서 받았는데요.

 

이번에 새롭게 등장한 registerForActivityResult를 이용해서 한번 해봤습니다.

 

val launcher = registerForActivityResult(StartActivityForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
            val intent = result.data

            if(intent == null){ //바로 사진을 찍어서 올리는 경우
                val results = arrayOf(Uri.parse(cameraPath))
                mWebViewImageUpload!!.onReceiveValue(results!!)
            }
            else{ //사진 앱을 통해 사진을 가져온 경우
                val results = intent!!.data!!
                mWebViewImageUpload!!.onReceiveValue(arrayOf(results!!))
            }
        }
        else{ //취소 한 경우 초기화
            mWebViewImageUpload!!.onReceiveValue(null)
            mWebViewImageUpload = null
        }
    }

이렇게 해주시면 됩니다!

728x90
반응형

댓글