티스토리 뷰

WebView를 다루는 방법의 두번째 시간입니다.


이전에 WebViewClient를 알아보았는데요.

링크는 아래와 같으니 심심하면 한번씩 눌러주세요.


Android WebView control 하기 (1/3) - WebViewClient

http://mrgamza.tistory.com/485?category=571010


그럼 바로 들어가겠습니다.


1
override fun onCloseWindow(window: WebView)
cs


팝업형태나 webview의 window가 사라지는 경우에 호출이 됩니다.

윈도우가 만들어지는 경우는 아래에 있습니다.


1
override fun onCreateWindow(view: WebView, isDialog: Boolean, isUserGesture: Boolean, resultMsg: Message): Boolean
cs


글을 적다보니 닫히는 경우를 먼저 적었네요.

많은 사이트들이 팝업을 추가하는 방식으로 개발을 하죠?

아무래도 이런 부분들은 모바일쪽으로 이전이 되면서 만들지 말아야 하는 부분인데 처리를 하여 주기 원하기 때문에 우리는 개발을 하여 주어야 겠지요.


이렇게 팝업을 노출하여야 하는 경우에 대해서 처리 방법은 다른 글에 적도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// For Android 3.0-
@Suppress("unused")
fun openFileChooser(uploadMsg: ValueCallback<Uri>) {
    openFileChooser(uploadMsg, "")
}
 
// For Android 3.0+
fun openFileChooser(uploadMsg: ValueCallback<Uri>, acceptType: String) {
    openFileChooser(uploadMsg, acceptType, "")
}
 
// For Android 4.1+ ... 4.4 제외
@Suppress("UNUSED_PARAMETER")
fun openFileChooser(uploadMsg: ValueCallback<Uri>, acceptType: String, capture: String) {
    fileChooserHelper.setCallback(uploadMsg)
    openFileChooser()
}
 
// For Android 5.0+
override fun onShowFileChooser(webView: WebView,
                               filePathCallback: ValueCallback<Array<Uri>>,
                               fileChooserParams: WebChromeClient.FileChooserParams): Boolean {
    fileChooserHelper.setCallbacks(filePathCallback)
    openFileChooser()
    return true
}
cs


파일 open을 눌렀을 경우에 호출되는 부분입니다.

이 부분에서 정말 헬 안드로이드라는것을 느끼게 됩니다.

그래서 제가 안드로이드 개발도 하지만 정말 하기 싫은겁니다. 전 iOS를 사랑함...

일단 위의 내용을 설명을 하자면, 각 버전들마다 호출되는 method가 다릅니다.

심지어 4.4대에는 안드로이드 쪽에서 잠시 정신이 나간것인지 저 메소드를 아예 호출조차 되지 않도록 하여 두었습니다.

이런 부분은 아예 javascript function을 호출하는 방법으로 해결하길 바랍니다.

파일 upload도 클라이언트에서 처리하고 이후에 처리된 파일의 리스트들을 전송하여 주는 방법등등...

요즘은 개발을 5이상으로 하는것 같아서 이 부분은 그냥 넘어가도 될것 같네요.


이제부터 나머지는 주석으로 쭉 달아보겠습니다.

그냥 function 이름에서도 느낌적으로 아실수 있을겁니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
private inner class ChromeClient : WebChromeClient() {
 
    // Javascript console message가 전달됩니다
    override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
        return super.onConsoleMessage(consoleMessage)
    }
 
    // 위와 동일하지만 deprecated in API level 8입니다.
    override fun onConsoleMessage(message: String, lineNumber: Int, sourceID: String) {
        super.onConsoleMessage(message, lineNumber, sourceID)
    }
 
    // Web DB를 사용하는 부분에서 용량을 제어할수 있도록 하는 부분인데요. Web DB가 표준에서 빠지면서 deprecated in API level 19입니다
    override fun onExceededDatabaseQuota(url: String, databaseIdentifier: String, quota: Long, estimatedDatabaseSize: Long, totalQuota: Long, quotaUpdater: WebStorage.QuotaUpdater) {
        super.onExceededDatabaseQuota(url, databaseIdentifier, quota, estimatedDatabaseSize, totalQuota, quotaUpdater)
    }
 
    // Geolocation API 사용하는 팝업이 닫힙니다
    override fun onGeolocationPermissionsHidePrompt() {
        super.onGeolocationPermissionsHidePrompt()
    }
 
    // Geolocation API 사용을 위한 팝업이 노출됩니다.
    override fun onGeolocationPermissionsShowPrompt(origin: String, callback: GeolocationPermissions.Callback) {
        super.onGeolocationPermissionsShowPrompt(origin, callback)
    }
 
    // Javascript에서 alert를 이용하여서 팝업을 노출할 경우입니다. 커스텀 가능
    override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
        return super.onJsAlert(view, url, message, result)
    }
 
    // Javascript의 confirm에 해당 합니다
    override fun onJsConfirm(view: WebView, url: String, message: String, result: JsResult): Boolean {
        return super.onJsConfirm(view, url, message, result)
    }
 
    // 페이지에서 탐색을 확정하는 대화 상자가 노출된다고 클라이언트에게 알리는 역할입니다
    // Javasciprt의 onbeforeunload()에 해당하며 이곳에서 true를 호출하면
    // 페이지는 탐색을 중지하고 JsResult에서 적절한 값을 호출할것으로 예상을 하게 됩니다.
    // 기본값은 false입니다
    override fun onJsBeforeUnload(view: WebView, url: String, message: String, result: JsResult): Boolean {
        return super.onJsBeforeUnload(view, url, message, result)
    }
 
    // Javascript prompt에 대한하는 기능을 제공합니다
    override fun onJsPrompt(view: WebView, url: String, message: String, defaultValue: String, result: JsPromptResult): Boolean {
        return super.onJsPrompt(view, url, message, defaultValue, result)
    }
 
    // deprecated in API level 17.
    // 이하 버전에서만 사용을 하여야 하고 자바스크립트 실행 시간이 초과 되었음을 알려줍니다
    // return true면 실행을 중지하고 return false면 계속 실행합니다.
    override fun onJsTimeout(): Boolean {
        return super.onJsTimeout()
    }
 
    // 클라이언트에 권한이 필요할 경우에 호출되는 부분입니다
    override fun onPermissionRequest(request: PermissionRequest) {
        super.onPermissionRequest(request)
    }
 
    // 클라이언트에 권한요청을 취소하는 경우입니다. UI로 노출하여 주었던 부분을 없애주면 됩니다.
    override fun onPermissionRequestCanceled(request: PermissionRequest) {
        super.onPermissionRequestCanceled(request)
    }
 
    // 페이지가 로드됨에 따른 퍼센트를 보여주는 부분
    override fun onProgressChanged(view: WebView, newProgress: Int) {
        super.onProgressChanged(view, newProgress)
    }
 
    // deprecated in API level 19.
    // 앱에서 사용할 캐시의 용량을 제한합니다
    // 현재는 HTML5 / Javascript Quota Management API로 이동하였습니다
    override fun onReachedMaxAppCacheSize(requiredStorage: Long, quota: Long, quotaUpdater: WebStorage.QuotaUpdater) {
        super.onReachedMaxAppCacheSize(requiredStorage, quota, quotaUpdater)
    }
 
    // 파비콘이 들어올 경우에 호출됩니다
    override fun onReceivedIcon(view: WebView, icon: Bitmap) {
        super.onReceivedIcon(view, icon)
    }
 
    // 타이틀이 있는 경우에 호출됩니다. 네비게이션에 타이틀 넣을때 좋겠네요
    override fun onReceivedTitle(view: WebView, title: String) {
        super.onReceivedTitle(view, title)
    }
 
    // 애플의 터치 아이콘을 눌렀을 경우에 호출됩니다.
    // https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html
    override fun onReceivedTouchIconUrl(view: WebView, url: String, precomposed: Boolean) {
        super.onReceivedTouchIconUrl(view, url, precomposed)
    }
 
    // 웹뷰의 포커스가 요청될 경우에 호출됩니다
    override fun onRequestFocus(view: WebView) {
        super.onRequestFocus(view)
    }
 
    // 커스텀뷰라고 웹뷰를 덮는 형태의 뷰가 보여질때 호출됩니다
    // 예를 들어서 youtube 같은 경우에도 이것에 해당할것 같네요.
    override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
        super.onShowCustomView(view, callback)
    }
 
    // deprecated in API lebel 18.
    // 위와 동일하지만 사용이 금지되었습니다.
    override fun onShowCustomView(view: View?, requestedOrientation: Int, callback: CustomViewCallback?) {
        super.onShowCustomView(view, requestedOrientation, callback)
    }
}
cs



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함