델파이로 하이브리드 앱 개발 시 안드로이드 환경에서 전화걸기 링크(tel:)를 클릭하면 웹페이지 오류(ERR_UNKNOWN_URL_SCHEME)가 표시됩니다.
원래는 전화걸기 기능이 실행되야 합니다.
이 글은 안드로이드 하이브리드 앱에서 웹브라우저(TWebBrowser)의 전화걸기, 문자전송 등의 링크 클릭 시 해당 기능이 동작하도록 처리하는 방법을 안내합니다.
먼저 웹페이지의 구성과 증상을 살펴봅니다.
웹페이지 구성과 증상
웹페이지(http://hjf.pe.kr/fmx/hybrid.php)에는 아래와 같이 전화걸기, 문자전송, 메일 전송 링크를 제공합니다.
[Phone number] / [Send sms] / [Send mail]
위 페이지를 안드로이드 앱의 웹브라우저에 표시하고, 전화걸기 링크를 클릭하면 다음과 같이 웹 페이지 오류가 표시됩니다.
위 오류가 발생하는 원인은 링크를 클릭하면 관련 액티비티가 처리해야 하는데 웹페이지로 인식해 웹브라우저가 분석하는데 실패하기 때문입니다.
그럼 링크 클릭 시 페이지 이동 대신 기능 액티비티를 표시하도록 수정해보니다.
파이어몽키 안드로이드 웹브라우저 소스 수정
위 링크 이슈를 해결하기 위해서는 파이어몽키 안드로이드 웹브라우저의 소스(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, 파이어몽키 소스코드 수정
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) if (Url.StartsWith('http://') or Url.StartsWith('https://')) then 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