Kotlin

[Kotlin] WebView Input 파일 선택

eulBlue 2024. 4. 3. 17:48

📱테스트 환경

Samsung Galaxy Tab Advanced2


Android WebView 에서 <Input type="file" ... /> 를 클릭하면 놀랍게도 파일선택기가 열리지 않는다.

파일선택기를 통해서 파일을 선택하려면 createChooser 를 이용해야 한다.

근데 웹상에 워낙 이상한 안되는 코드들이 많이 돌아다니다 보니 .. 쉽지가 않다 ..

나도 거기에 속아서 작성한 코드들이 엉망진창이여서 작동을 안하다 보니 오래걸렸다.

일단 ChromeClient 기본적인 세팅은 했다고 가정하고 파일을 선택하기 위해서는 onShowFileChooser 를 사용해야한다.

override fun onShowFileChooser(
        webView: WebView?,
        filePathCallback: ValueCallback<Array<Uri>>?,
        fileChooserParams: FileChooserParams?
    ): Boolean {
        val intent = Intent(Intent.ACTION_GET_CONTENT)
        intent.setType("*/*")
        activity.startActivityForResult(intent, 1)
        return super.onShowFileChooser(webView, filePathCallback, fileChooserParams)
    }
}

이렇게만 해도 파일선택기는 잘 열린다.

startActivityForResult 를 사용했으니까 결과를 받아보기 위해서는

@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    data?.data?.let { uri ->
        val contentResolver = this.contentResolver
        val mime = contentResolver.getType(uri)
        val type = when {
            mime?.startsWith("image/") == true -> "image"
            mime?.startsWith("video/") == true -> "video"
            else -> "unknown"
        }
    }
}

나같은 경우에는 이미지를 받아와서 타입을 나누고 이후 Web 으로 데이터를 전송해주었다.

문제는 이게 Deprecated되었다는 건데 .. 해결방안으로 ActivityResultContracts가 사용된다는데

아직 더 좋은 해결방안을 찾지 못해서 사용중이다 ..

더 좋은 방법이 있다면 알려주면 정말 감사하겠다.ㅠ

그리고 다른 사람들은 나처럼 삽질하는 경우가 없었으면 좋겠다.