본문 바로가기

Android/개인 기록

(10)
[Android Tip] Spinner: DropDown(다른 글로 수정됨) DropDown Spinner아래의 이미지 처럼 터치했을 때, 값을 사용자가 선택할 수 있도록 목록 형태로 펼쳐지는 것을 드롭다운(Drowdown) 이라고 한다.안드로이드에서 드롭다운은 스피너(Spinner) 를 이용해 구현할 수 있다.이번 포스팅에서는 스피너를 구현하는 방법과 커스텀하는 방법에 대해 알아보겠다.ViewBinding 환경을 고려하고 작성된 글이다. 이번 글의 내용에서 만들어가는 드롭다운의 결과는 아래와 같다.간단하게 드롭다운에서 아이템을 선택하면 그에 따라 텍스트가 바뀌는 예제다. 코드 전문은 아래 깃허브 저장소에서 확인 가능하다.샘플 프로젝트 코드 링크 GitHub - parade621/Basic_Spinner: Tstory Basic Spinner DropDown 코드 전문Tstory..
Debounce와 Throttle, Event 핸들링 본인이 전담해서 운영 중인 어플리케이션은 로그인을 하거나 특정 API를 호출할 때, 서버에 로그를 남긴다.앱 운영을 전담하기 이전부터 있던 고질적인 문제가 있었는데.. 사용자가 로그인을 시도 할 때, 1초도 안되는 시간동안 소수초 간격으로 Api가 연속 호출되는 문제였다.다수의 이용자가 사용하는 서비스이고, 최근 사용자가 늘어가는 만큼, 이대로 방치하면 서버의 과부하가 유발되어 서비스 품질이 낮아질 수 있겠다는 생각이 들었다.마침 최근에 Medium에서 Debounce와 Throttle에 관련된 칼럼을 읽었던 기억이 있어서 적용해 보았고, 이슈를 해결할 수 있었다. 비슷한 이슈를 겪는 사람들에게 기술적 인사이트를 제공할 수 있겠다는 생각에, 관련 내용을 기록해 둔다.Debounce와 Throttle의 개..
[Compose] Custom CameraView 만들기 이미지 업로드 관련 서버가 자꾸 맛이 가는 걸 언제 어디서나 확인할 수 있도록 하기 위해 서비스 중인 앱에다가 PC 없이도 로그를 볼 수 있는 스크린을 만들고 있다. 현재 서비스 중인 앱의 카메라 기능은 전부 XML으로 커스텀뷰를 만들어서 사용 중인데, 요즘 Compose를 공부 중이라 그런지 이번 기능은 괜히 컴포즈로 만들어 보고 싶다는 생각이 들었다. 그래서 한번 만들어 봤다. 일단 사진을 촬영해서 서버에 전송해야하는데.. 진짜 딱 프리뷰-촬영만 만들면 되는데, 갑자기 난독증이 도진건지 설명이 어려운건지 Compose Camera 관련 자료들이 이해하기 넘모 어려웠다. 그래서 여차저차 간단하게 딱 프리뷰-촬영 기능만을 구현한 코드를 기록해 두려고 한다. [❗️주의❗️] 진짜 딱 나만 쓴다는 생각으로 ..
[Android Tip] Immortal Service (죽지 않는 서비스) [Immortal Service: 죽지않는 서비스]에어맨이 안죽음ㅋㅋ앱을 개발하다보면 죽지 않는 서비스(Immortal Service)가 필요한 순간들이 있다.필자는 사용자의 위치정보를 지속적으로 가져오는 GPS 서비스가 필요했다.당장 생각나는 다른 예시로는, 실시간 영상 스트리밍 어플을 구현할 때, Socket 통신 부분을 서비스 컴포넌트로 작성하여 스트리밍을 계속 유지할 수도 있겠다.이번 글에서는 앱의 필수 기능으로, 절대로 죽으면 안되는 서비스를 구현하는 방법에 대해서 알아보자. [주의]이후로 작성된 내용은 필자가 직접 구현하고 작성한 것으로, 검증을 받은 것이 아니다. 때문에 환경에 따라 문제가 발생할 수 있다는 것을 미리 고지한다.[다양한 구현 방법]죽지않는 서비스는 생각보다 다양한 방법으로 구..
Application Restart (앱 재실행) 들어가며... 앱을 만들다보면 강제로 재실행을 해야하는 순간들이 몇 있다. 본인의 경우, 다국어를 지원하는 앱에서 언어 변경사항을 모든 액티비티와 프래그먼트에 적용해, 자동으로 로드 될 수 있도록 하기 위한 조치였다. 앱을 강제로 재실행 시키기 [코드] fun restartApp(context: Context) { val intent = context.packageManager.getLaunchIntentForPackage(context.packageName) if (intent != null) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) context.startActivity(intent) Runt..
[Android: Basic] GPS Location Service (위치정보 서비스) 어플리케이션 개발을 하다보면, 사용자의 위치 정보가 필요해지는 경우가 있습니다. 많은 방식들이 있겠지만, 저는 무엇보다 포그라운드 서비스로 위치 정보를 받는것을 선호합니다. 일전에 Jetpack의 WorkManager로 위치정보를 받아보려고 한 적이 있는데, 막상 코드를 작성하고 돌아가는 것을 보니 왜 구글에서 위치정보 획득을 Foreground service로 권장하는지 알겠더군요. 언급한 Work Manager 부분은 따로 글을 작성해서 코드와 함께 더욱 자세히 설명하도록 하겠습니다. 아무튼, 저는 2개의 게시글에 걸쳐, 제가 작성해온 위치 정보 서비스의 코드들과 그 동작 방식을 설명하려 합니다. 이를 위해서는 Forground Service에 대한 사전지식이 필요하며, 해당 내용은 이 글에 작성해 ..
Permission Check (권한 요청) 들어가며..안드로이드 개발을 하다보면 권한 요청이 사소하게 성가시다.반드시 필요하지만, 손볼 일이 많지 않다보니 작성해야하는 순간이 오면 헷갈리기 쉽상이었다.물론 구글링으로 다른 뛰어난 분들의 코드를 쉽게 접할 수 있고, 최근에는 gpt의 도움을 받을 수도 있겠지만, 일단 내 코드 스타일과 맞는 걸 찾기는 어려웠다.그래서 나중에 내가 사용할 목적으로 기록해 둔다.검증 없이 작성된 코드이므로 문제가 발생 할 수 있다.발생한 문제는 공유해주면 같이 해결해보도록 최대한 노력하겠다. 언제든지 피드백은 환영이다. 최종 수정일: 2024.01.18Permission Check우선, Manifest에 필요한 권한들을 등록해 준다. 본인은 인터넷 접근, 알림, 카메라, 위치 정보, 저장소의 이미지 읽기 권한, 포..
[Android] ignoring header x-firebase-locale because its value was null과 Realtime Database 사용이 안되는 오류 해결 Authentication과 Realtime Database를 사용할 때, ignoring header x-firebase-locale because its value was null로그가 표기되거나 데이터가 실시간으로 저장이 되지 않는다면 sdk 버젼을 낮추는 다운그레이드가 도움이 될 수 있습니다. 저를 포함한 제 주변인들도 sdk31.3.10 이상을 사용하는 사람들이 이런 오류를 겪었는데, 일단 구글링해서 나오는 비밀번호 8자? Manifest.xml 수정? DNS IP 추가? 전부 씨알도 안먹히더군요ㅋㅋ 어쩌다 10분~ 15분 뒤에 적용이 되긴하던데, 테스트 한번 하려고 하염없이 기다릴순 없지 안겠습니까. 저는 sdk 버전을 다운그레이드하여 해결하였습니다. 그럼 방법을 살펴보겠습니다. https:/..