본문 바로가기

프로그래밍/Android 짜투리 지식

[android] 4.4 webview 파일 첨부

openFileChooser킷캣(os ver 4.4) 에서 변동이 생겨 킷캣 이상에서 webview가 이 함수를 호출하지 못한다.


롤리팝에서는 openFileChooser Deprecated 되고 onShowFileChooser라는 것이 추가됨

 

Api Level

WebChromeClient class version

Function

16 (Jellybean)

14

Public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType)

19 (Kitkat)

19

public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)

21 (Lollipop)

21

public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,

            FileChooserParams fileChooserParams)

 

이것은 앱의 참조 SDK와는 별개로 빌드하는 targketSdk에 영향을 받는데 tagketSdk 19 미만이라면 WebChromeClient class의 참조버전이 api level 16 sdk를 참조해서 문제가 없다. 

하지만 taget이 19로 올라가면 API level 19의 WebChromeClient를 참조하게 되므로 함수를 찾을 수 없게 된다.

 

때문에 tagetSdk가 19이상인 프로젝트라면 JavaScriptInterface 함수 (흔히 Bridge함수라 부름)를 추가해서 javascript로 호출을 하는게 가장 깔끔한 방법이 되겠다.


정의부분

class MyJavaScriptInterface {
   @JavascriptInterface
    public void showHTML(String html) {
        Toast.makeText(getApplicationContext(), html, 1).show();
        Log.i("hatti.html", String.valueOf(html));
    }
}

WebView webview = new WebView();
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

호출부분


  • android java에서 임의의 페이지의 스크립트를 긁어오고 싶다면

webView.loadUrl("javascript:window.HTMLOUT.showHTML(document.getElementsByTagName('html')[0].innerHTML);");
  • 웹에서 호출한다면 window.android.showHTML(msg);로 접근, 호출할 수 있다.
  • 이 모든건 addJavascriptInterface()의 등록으로부터 시작된다.

젤리빈 (os ver 4.3 ↑) 주의사항


bridge 클래스의 함수에 대해서

@JavascriptInterface annotation이 있어야 정상동작 하니 이부분은 빼먹지 말자.


progruad 설정시 

-keepattributes *Annotation*를 추가하여 annotation을 예외 시키자.




addJavascriptInterface사용에 관한 예제는 각자..

'프로그래밍 > Android 짜투리 지식' 카테고리의 다른 글

[android] 인상적인 View  (0) 2015.06.23
[android] attr/actionbarSize  (0) 2015.03.24
[android] code style  (0) 2015.03.05
[android] Lollipop (v5.x) service 오류  (0) 2015.02.11
[android] sqlite 사용하기  (2) 2015.02.11