본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] WebChromeClient 의 file upload

by 돼지왕 왕돼지 2021. 1. 29.
반응형

 

-

WebView 기본 구현으로는 html 의 <input type=“file”> 를 처리할 수 없다.

 

 

-

Webview 에서 file upload btn 이 클릭되었을 때

WebChromeClient 의 callback 이 불리게 되며, 여기서 param 으로 전달되는 callback 객체에 Uri 를 전달해주어야 file upload 를 시킬 수 있다.

 

 

-

그럼 file upload btn 이 클릭되었을 때 어떤 callback 이 불리느냐?

이 부분은 직접 테스트한 것은 아니고, 인터넷 정보에 따르면...

 

android 3.0 (HoneyComb) 미만에서는 아래 callback 이..

public void openFileChooser( ValueCallback<uri> uploadMsg)

 

android 3.0 이상 ~ 4.1( JB ) 미만에서는 아래 callback 이..

public void openFileChooser( ValueCallback<uri> uploadMsg, String acceptType)

 

android 4.1 이상 ~ 5.0 (Lollipop) 미만에서는 아래 callback 이..

public void openFileChooser(ValueCallback<uri> uploadMsg, String acceptType, String capture)

 

android 5.0 이상에서는 아래 callback 이..

public boolean onShowFileChooser(
            WebView webView, 
            ValueCallback<uri[]> filePathCallback,
            WebChromeClient.FileChooserParams fileChooserParams)

 

불린다고 한다.

 

 

-

최신 WebChromeClient 소스에 가보면…

아래와 같이 되어있는데, 이는 WebView 가 LOS 부터 따로 업데이트 되면서 이 녀석이 deprecate 되어 쓰면 안 된다는 것을 명시적으로 보여주는 것으로 보인다. (@hide 설명에 따르면 사실 이 녀석은 그 전 버전에서도 사실은 사용했으면 안 되는 녀석인데.. 그냥 불렸나보다..)

/**
* @hide This method was not published in any SDK version.
*/
@SystemApi
@Deprecated
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) {
    uploadFile.onReceiveValue(null);
}

 

 

-

openFileChooser callback 을 받으면, acceptType 에 mimeType 이 들어있기 때문에,

해당 mimeType 을 처리할 수 있는 app 을 실행시켜서 uri 을 얻어오고 해당 uri 를 전달된 callback 을 통해 전달해주면 된다.

 

 

-

android 5.0(LOS) 미만과의 호환성을 위해서 READ_EXTERNAL_STORAGE 권한이 필요할 수 있고, target 이 NOS 이상인 경우에는 FileProvider 를 사용해야 할 수도 있다.

상황에 따라서는 Storage 관련 Runtime permission 을 정의해야 할 수도 있다.

 

 

 

 

 

반응형

댓글