Delphi 안드로이드 웹브라우저에서 "tel:, sms:" 링크가 동작하지 않는 이슈 해결하기
2015.06.26 23:02
델파이로 하이브리드 앱 개발 시 안드로이드 환경에서 전화걸기 링크(tel:)를 클릭하면 웹페이지 오류(ERR_UNKNOWN_URL_SCHEME)가 표시됩니다.
원래는 전화걸기 기능이 실행되야 합니다.
이 글은 안드로이드 하이브리드 앱에서 웹브라우저(TWebBrowser)의 전화걸기, 문자전송 등의 링크 클릭 시 해당 기능이 동작하도록 처리하는 방법을 안내합니다.
먼저 웹페이지의 구성과 증상을 살펴봅니다.
웹페이지 구성과 증상
웹페이지(http://hjf.pe.kr/fmx/hybrid.php)에는 아래와 같이 전화걸기, 문자전송, 메일 전송 링크를 제공합니다.
1
2
3
|
< a href = "tel:021231234" >[Phone number]</ a > / < a href = "sms:01012341234" >[Send sms]</ a > / < a href = "mailto:abc@mail.com" >[Send mail]</ a > |
위 페이지를 안드로이드 앱의 웹브라우저에 표시하고, 전화걸기 링크를 클릭하면 다음과 같이 웹 페이지 오류가 표시됩니다.
위 오류가 발생하는 원인은 링크를 클릭하면 관련 액티비티가 처리해야 하는데 웹페이지로 인식해 웹브라우저가 분석하는데 실패하기 때문입니다.
그럼 링크 클릭 시 페이지 이동 대신 기능 액티비티를 표시하도록 수정해보니다.
파이어몽키 안드로이드 웹브라우저 소스 수정
위 링크 이슈를 해결하기 위해서는 파이어몽키 안드로이드 웹브라우저의 소스(FMX.WebBrowser.Android.pas)를 수정 해야합니다.(아래 과정은 델파이 XE8 기준으로 설명합니다. 다른 버전은 소스의 경로와 소스코드 내용 중 일부가 다를 수 있습니다.)
1, 안드로이드 소스코드 복사
아래 경로에서 안드로이드 웹브라우저 소스(FMX.WebBrowser.Android.pas)파일 복사합니다.
- C:\Program Files (x86)\Embarcadero\Studio\16.0\source\fmx\FMX.WebBrowser.Android.pas (XE8 기준)
프로젝트 경로에 파일을 복사한 이유는 델파이 컴파일러는 프로젝트 파일의 경로의 소스파일을 우선적으로 참고해 컴파일합니다. 위 특징을 이용해 프레임워크 소스코드를 프로젝트 파일과 같은 경로에 놓고 수정하면 수정된 내용이 적용되어 컴파일 됩니다.
2, 파이어몽키 소스코드 수정
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
|
function TAndroidWebBrowserService . TWebBrowserListener . shouldOverrideUrlLoading( P1: JWebView; P2: JString): Boolean ; var Url: string ; Intent: JIntent; begin Url := JStringToString(P2); FWBService . ShouldStartLoading(Url); Result := False ; // 리턴값이 True이면 페이지를 랜더링하지 않음 // http 또는 https 인 경우 False(랜더링 함) // 그 외 True(렌더링 안함) 로딩을 중지 함(P1.stopLoading) Result := False else begin // tel:, sms:, mailto:, geo: 등은 해당 Activity 실행 Intent := TJIntent . JavaClass . init(TJIntent . JavaClass . ACTION_VIEW, TJnet_Uri . JavaClass . parse(P2)); try SharedActivity . startActivity(Intent); Result := True ; except end ; end ; // 렌더링 안하므로 로딩 중지 if Result then P1 . stopLoading; end ; |
3, 테스트
참고 글
- http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
- http://www.androes.com/119
- http://itreading.tumblr.com/post/75376699028/webview
- http://stackoverflow.com/questions/23059782/tel-and-sms-links-not-working-in-twebbrowser-within-delphi-xe5-android-app