
Flutter로 전화번호를 입력해 시스템 전화 앱에서 전화를 걸고, 기기의 통화 기록을 펼쳐 볼 수 있는 앱을 만드는 방법을 소개한다. 통화 기록은 사용자가 목록을 처음 열 때 불러와 앱 상태에 저장하며, Android 권한 설정도 필요하다.
앱에는 전화번호 입력란과 통화 버튼, 통화 기록을 표시하는 펼침 목록이 들어간다. 전체 화면에는 별도의 물결 애니메이션 배경을 배치한다.
필요한 패키지는 url_launcher 6.3.2, call_log 6.0.1, wave 0.2.5다. pubspec.yaml에 추가한 뒤 flutter pub get을 실행한다. url_launcher는 전화 앱을 열고, call_log는 기기 통화 기록을 읽으며, wave는 배경 애니메이션에 사용한다.
전화번호는 tel: URI로 전달하고 LaunchMode.externalApplication을 지정해 앱 바깥의 시스템 전화 앱에서 열도록 한다. 기기에서 전화 앱을 사용할 수 없으면 예외가 발생한다.
통화 기록은 앱 시작 시 불러오지 않는다. 사용자가 ExpansionTile을 처음 펼칠 때 CallLog.query()를 호출하고 결과를 상태에 저장한다. 이후 목록을 닫았다 다시 열어도 기록을 다시 요청하지 않는다. 글은 이 방식을 비용이 큰 데이터를 요청 시 한 번 불러와 상태에 보관하는 패턴으로 설명한다.
Android에서 통화 기록을 읽으려면 android/app/src/main/AndroidManifest.xml에 READ_CALL_LOG 권한을 선언해야 한다. 전화 앱을 감지하려면 매니페스트에 DIAL 인텐트와 tel 스킴을 포함하는 <queries> 블록도 추가해야 한다. 이 블록이 없으면 Android 11 이상에서 앱이 사용 가능한 전화 앱을 확인하지 못할 수 있다. 자세한 내용은 Android 패키지 공개 범위 제한 문서를 참고하면 된다.
배경은 나머지 앱과 분리된 StatelessWidget으로 구성한다. 앱 화면의 Stack에서 배경을 먼저 배치해 다른 UI 뒤에 표시하며, 글은 이 분리 덕분에 UI 상태 변경으로 발생하는 재빌드가 물결 애니메이션을 다시 시작시키지 않는다고 설명한다.
다음 단계로 통화 기록 조회 전 permission_handler를 이용한 런타임 권한 요청, 통화 유형과 통화 시간 표시, 기록 검색, 정규식 기반 전화번호 검사와 오류 메시지 추가를 제안한다.
부록: 원문 예시
<queries> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent> </queries>
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요