작업 일지11 [Android][Compose] MaterialCalendarView를 Compose에서 사용하기 기존 xml로 작업한 PWFB 프로젝트를 Compose로 변경하면서 기존에 구현했던 캘린더 UI를 어떻게 구현해야 할까 고민이 많았다. 캘린더는 MaterialCalendarView를 사용하고 있었는데, 다른 캘린더 라이브러리나 직접 구현하는 것보다는 기존 코드를 덜 수정하는 방향으로 진행하고 싶었다. Compose에는 AndroidView라는 컴포저블이 있는데, Compose에서 아직 사용할 수 없는 UI 요소를 사용하는 경우에 쓰인다. AndroidView 컴포저블을 사용해서 MaterialCalendarView를 사용할 수 있었다.AndroidView@Composable@UiComposablefun AndroidView( factory: (Context) -> T, modifier: M.. 작업 일지 2024. 5. 19. [Android] 내비게이션의 다음 경로 정보 구하기#2 [Android] 내비게이션 다음 경로의 정보 구하기#1 프로젝트에서 내비게이션을 사용하여 다음 경로까지의 거리 값과 회전 정보를 구해야하는 일이 생겼다. 개발 과정과 사용하게 된 API에 대해서 정리를 해본다. 사용 API ◾ 카카오내비 길찾기 SDK ogyong.tistory.com 이전 글에서는 내비게이션 사용을 위한 API 관리와 출발지, 도착지를 어떻게 설정했는지에 대해서 정리했다. 이번에는 지도 화면에서 길찾기 버튼을 눌렀을 때부터 내비게이션 다음 경로 정보를 구하기까지에 대해서 정리하려고 한다. 카카오내비 길찾기 SDK 참고 자료 링크 API 레퍼런스 가이드 에러 값 확인 내비게이션 사용을 위한 인스톨 및 초기화 @HiltAndroidApp class ServiceApplication: Ap.. 작업 일지 2024. 3. 7. [Android] 내비게이션의 다음 경로 정보 구하기#1 프로젝트에서 내비게이션을 사용하여 다음 경로까지의 거리 값과 회전 정보를 구해야하는 일이 생겼다. 개발 과정과 사용하게 된 API에 대해서 정리를 해본다. 사용 API ◾ 카카오내비 길찾기 SDK 우선 내비게이션을 사용하기 위해서 네이버, 카카오, 티맵과 같은 플랫폼에서 제공하는 API 또는 SDK를 사용해야 했다. 이 중에서 '카카오내비 길찾기 SDK'(링크)는 KNRGCode(링크)라는 회전 구간 경로 분류 코드를 내려주는데 별도의 구현없이 필요한 정보를 얻을 수 있어서 선택하게 됐다. ◾ SK Open API 지오코딩-좌표변환 API / 경로안내-직선 거리 계산 API 기기에서 GPS를 통해 얻는 좌표는 WGS84 좌표계다. 하지만 카카오내비에서는 KATECH 좌표계를 사용하기 때문에 좌표변환이 필.. 작업 일지 2024. 3. 5. [Android][Compose] Scaffold-topBar가 UI를 가리는 현상 Jetpack Compose 애니메이션 Codelab을 하던 중 AnimatedVisibility()이 보이지 않는 문제를 겪었다. Codelab은 Material2를 기준으로 되어 있었고, 나는 Material3에 맞춰서 진행을 하고 있었는데 AnimatedVisibility가 화면에 표시되지 않았다. Codelab의 코드와 하나씩 비교를 해도 원인을 찾지 못하다가 AnimatedVisibility의 높이를 늘려보고 이유를 찾았다. 내가 직접 작성한 코드와 Codelab의 코드 중 차이점은 Material3를 사용하는가였는데, Material3의 경우 Scaffold에서 Modifier를 정의하지 않으면 내부 블록의 UI가 중첩되고 있었다. Modifer를 정의하는 대신 Scaffold-topBar에 .. 작업 일지 2023. 5. 31. [Android] 리스트에서 아이템 삭제 후 페이징할 때 조심할 점 RecyclerView의 addOnScrollListener를 사용해서 리스트의 마지막 위치가 표시될 때 다음 페이지에 대한 정보를 서버에 요청하여 페이징 작업을 하였다. 문제는 리스트에서 아이템을 삭제하고 다음 페이지에 대한 정보를 서버에 요청하면 아이템 하나가 사라지는 일이 생겼다. DB에 15개의 아이템이 있고, 1페이지에 5개씩 보인다고 가정하자. 4번 아이템을 삭제하게 되면 DB에 저장된 데이터는 아래 이미지처럼 변하게 된다. 여기서 문제가 발생한다. 4번을 삭제하고 2페이지를 호출하면 7~11까지의 아이템이 호출되어 6번 아이템을 볼 수가 없다. 삭제 api를 호출하여 아이템이 삭제되면 현재 페이지에 대한 리스트를 다시 호출을 한다. 현재 페이지에 추가된 마지막 값을 꺼내서 기존 리스트에 붙여.. 작업 일지 2023. 1. 2. [Android] Mqtt, subjectAltNames에 대한 고민 Mqtt 통신과 SSL 인증 작업을 하면서 javax.net.ssl.SSLHandshakeException: No subjectAltNames on the certificate match 라는 에러를 마주쳤다. 해당 에러는 인증서의 호스트 명과 접속하려는 호스트 명이 일치하지 않을 때 발생한다고 한다. mqttv3의 1.2.1 버전 이상부터는 MqttConnectOptions().isHttpsHostnameVerificationEnabled에 false 값을 부여하면 호스트 명이 일치하는지를 무시한다. 정상적으로 인증을 처리한 것이 아닌 임시방편이기 때문에 근복적인 해결이 필요했다. ca 파일을 열어서 인증서의 호스트 명을 확인해보니 127.0.0.1로 저장되어 있었고, 접속하려는 IP와 달라서 생기는 .. 작업 일지 2022. 12. 21. [Android] ExifInterface와 Matrix로 이미지 회전 시키기 프로필 이미지를 변경하면 서버에 uri를 전달하고, 서버에서 이미지의 새 uri를 받아서 Glide를 통해 보여주고 있었다. 문제는 갤러리에서 선택한 캡처와 다운로드된 이미지는 프로필에 정상적으로 등록이 됐는데, 폰으로 촬영한 이미지의 경우에는 등록된 프로필 이미지를 보면 사진이 회전되어 있었다. ExifInterface와 Matrix를 이용하면 해결할 수 있다고 한다. 해결 과정은 아래와 같다. 1. ExifInterface로 이미지의 회전 정보를 알아낸다. 2. Matrix를 이용해 회전한 값만큼 회전시킨다. 3. 새로운 Bitmap을 만들고 Matrix를 적용시킨다. 4. Bitmap을 파일에 저장하여 uri 정보를 얻는다. 5. 새로 얻은 uri를 서버에 전달한다. 이미지 회전 예제 예제로 회전된.. 작업 일지 2022. 11. 29. [Android] 폴더블 기기를 접거나 폈을 때 UI 처리 [Android] 폴더블 기기 UI 대응하기 일반적인 스마트 폰에 맞춰서 개발을 하다가 갤럭시 폴드를 접하고 나서 문제가 생겼다. 대부분의 위젯에 width와 height을 고정 dp 값으로 사용했는데 갤럭시 폴드가 접혀있을 때는 위젯이 잘리고, ogyong.tistory.com 이전에 폴더블 기기의 UI를 어떻게 대응했는지 글을 작성했었는데, 폴더블 기기를 접거나 폈을 때 어떻게 처리했는지에 대해서도 정리하려고 한다. 기기가 회전하거나 사이즈가 변경(접기, 펴기 등)되면 화면이 재구성되어 Activity가 onCreate부터 다시 시작하게 된다. android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|smallestScreen.. 작업 일지 2022. 11. 24. [Android] 기기 화면을 가로, 세로로 회전 시키기 [Android] Screen Size로 폰과 태플릿 구분하기 홈 트레이닝 서비스 프로젝트 중에 폰은 세로모드, 태블릿은 가로모드로 고정을 해달라는 요청을 받았다. 현재 사용 중인 기기가 폰인지 태블릿인지를 구하고 가로 또는 세로모드를 고정시켜야 ogyong.tistory.com 이전 글에서 기기 타입에 따라 가로, 세로 화면을 고정시켜야 하는 작업을 해야한다고 했는데, 이번에는 기기 화면을 회전 시키는 것을 해보려고 한다. 기기의 화면을 회전 시키려면 Activity의 requestedOrientation을 업데이트 해야한다. requestedOrientation(set, get)은 Manifest에서 등록한 가로, 세로 방향 값이나 마지막으로 set한 값을 반환한다. 반환하는 값은 ActivityIn.. 작업 일지 2022. 11. 24. [Android] Screen Size로 폰과 태플릿 구분하기 홈 트레이닝 서비스 프로젝트 중에 폰은 세로모드, 태블릿은 가로모드로 고정을 해달라는 요청을 받았다. 현재 사용 중인 기기가 폰인지 태블릿인지를 구하고 가로 또는 세로모드를 고정시켜야겠다고 생각했다. 기기의 타입을 확인하는 방법은 안드로이드의 Configuration에서 제공하는 screenLayout을 사용하면 된다. 우선 screenLayout은 화면 전체 레이아웃에 대한 비트 마스크라고 한다. (비트 마스크 : 비트를 마스킹하는 기술로 비트 연산을 통해 정수의 이진 비트를 처리하는 작업) Configuration에는 ScreenLayout에 대한 정적 변수들이 있다. 그중 SCREENLAYOUT_SIZE_MASK는 screenLayout의 크기를 인코딩하는 비트라고 한다. • SCREENLAYOUT.. 작업 일지 2022. 11. 23. [Android] 폴더블 기기 UI 대응하기 일반적인 스마트 폰에 맞춰서 개발을 하다가 갤럭시 폴드를 접하고 나서 문제가 생겼다. 대부분의 위젯에 width와 height을 고정 dp 값으로 사용했는데 갤럭시 폴드가 접혀있을 때는 위젯이 잘리고, 펼쳐져 있을 때는 위젯의 크기가 작아 보이거나 위젯들 사이의 여백이 너무 크다는 것이었다. 처음 이 문제를 직면하고 나서는 ConstraintLayout의 bias 속성을 사용해서 반응형으로 처리하면 될 것이라고 생각했다. bias를 사용하면 일반폰과 폴더블 폰이 접혔을 때는 UI가 괜찮게 나온다. 하지만 폴더블 폰이 펼쳐졌을 때 해상도가 높다 보니 버튼 크기가 이상하게 보일 정도로 커지는 문제가 있었다. 기기 타입 찾기 이 문제를 해결하려면 기기 타입별로 다른 dp 값을 적용시켜야 한다고 생각이 들었다... 작업 일지 2022. 11. 22. 이전 1 다음