델파이로 하이브리드 앱 개발 시 안드로이드 환경에서 전화걸기 링크(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 기준)
위 파일을 델파이 프로젝트 파일(*.dproj)과 같은 경로에 붙여넜습니다.

프로젝트 경로에 파일을 복사한 이유는 델파이 컴파일러는 프로젝트 파일의 경로의 소스파일을 우선적으로 참고해 컴파일합니다. 위 특징을 이용해 프레임워크 소스코드를 프로젝트 파일과 같은 경로에 놓고 수정하면 수정된 내용이 적용되어 컴파일 됩니다.

 

 

2, 파이어몽키 소스코드 수정

위에서 복사한 소스코드를 델파이 IDE > File > Open 메뉴로 엽니다.
그리고, shouldOverrideUrlLoading 메소드 구현부를 수정하겠습니다.
 
shouldOverrideUrlLoading 메소드는 웹뷰의 URL 변경 시 발생되며, URL에 따라 호스트 애플리케이션이 제어할 수 있는 기회를 주는 이벤트입니다.(안드로이드 기술문서: shouldOverrideUrlLoading)
 
리턴 값이 True이면 호스트가 제어하기 때문에 화면을 이동하지 않고, False이면 화면을 이동합니다.
 
다음 코드를 참고해 shouldOverrideUrlLoading 메소드 구현부를 수정합니다.

 

 

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)
  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, 테스트

위와 같이 수정하고 빌드 후 전화번호 링크를 클릭하면 아래와 같이 관련된 기능이 동작합니다.

 

 

 

 

참고 글

 


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17932
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
983 [도서/PDF/소스코드] 델파이 Begin...End - 3장. 컴포넌트와 친해지기 [1] 관리자 2019.08.09 615
982 [도서/PDF/소스코드] 델파이 Begin...End - 2장. 폼의 특성과 띄우기 [1] 관리자 2019.08.09 723
981 [도서/PDF/소스코드] 델파이 Begin...End - 1장. 델파이로 프로젝트 시작하기 [1] 관리자 2019.08.08 1903
980 [도서/PDF/소스코드] 델파이 Begin...End - 0장. 책 소개. 저자 소개. 목차 관리자 2019.08.06 790
979 [제품 설치 방법] 엠바카데로 본사 서버 이슈로 인해 설치가 어려운 경우 이 방법을 활용하세요. 관리자 2019.07.31 422
978 이 달의 기술자료 - 2019년 08월 험프리 2019.07.26 323
977 구글 플레이 스토어에 안드로이드 32-bit 배포를 위한 연장 요청 방법 [4] 관리자 2019.07.25 840
976 [10.3 리오][업데이트 2] C++17이 윈도우 64-bit에서도 지원됩니다. file 관리자 2019.07.25 314
975 [10.3 리오][업데이트 2] 델파이에서 맥OS 64-bit 애플리케이션 개발이 가능합니다. 관리자 2019.07.25 440
974 [설치방법] 10.3 리오 업데이트2 관리자 2019.07.24 1269
973 [발표자료] 20190718 멀티-플랫폼 앱 멋지게! 쉽게! 빠르게! 완성하기 file 관리자 2019.07.19 406
972 [10.3 리오][업데이트 2] What's NEW! 신기능 자세히 보기 관리자 2019.07.19 2459
971 [다시보기] 소개합니다! FmxLinux - 델파이 파이어몽키 앱을 리눅스용으로 배포하기 관리자 2019.07.17 378
970 iOS 배포 시 에러 해결방법: Cant' start debugserver on device - device support image was not mounted 관리자 2019.07.17 484
969 멀티-플랫폼 앱 멋지게! 쉽게! 빠르게! 완성하기 - #3 바로 커스터마이징해서 빠르게 완성하기 file 험프리 2019.07.16 415
968 멀티-플랫폼 앱 멋지게! 쉽게! 빠르게! 완성하기 - #2 완성형 UI에 필요한 데이터 손쉽게 연동하기 file 험프리 2019.07.11 406
967 리눅스에 RAD서버 배포하기 관리자 2019.07.11 454
966 iOS 개발환경 설정이 잘 되지 않은 경우 체크사항 - iOS 버전 확인 필요 관리자 2019.07.11 264
965 FMX Linux (파이어몽키 리눅스) 첫 걸음 시작하기 관리자 2019.07.10 1200
964 멀티-플랫폼 앱 멋지게! 쉽게! 빠르게! 완성하기 - #.1 한번에 멋지게 개발하기 file 험프리 2019.07.09 1880