전체 글 14

ComposeView 이미지 다운로드 기능을 구현해보자!

💻 구현해야 하는 기능 매쉬업 앱의 마이페이지 구성요소 중에 “기수 카드”가 있는데, “다운로드” 버튼을 누르면 이 기수 카드를 갤러리에 저장해줘야 한다. 이미지 다운로드 기능은 심리테스트 결과지 저장이나 이체 확인증 등 꽤 자주 사용되는 것 같다. 그런데 이번에는 xml view가 아니라 compose view를 이미지로 저장해야해서 그 방법을 알아보려고 한다! 🌃 View를 이미지로 저장하는 기본 프로세스 기본적으로 View를 이미지로 저장하기 위해서는 다음과 같은 과정으로 진행된다. (* 틀릴 수도 있음) View → Bitmap → Base64(String) → File → Storage에 저장 View를 Bitmap으로 변환하는 과정에서 기존의 xml view는 View.*drawToBitmap..

카테고리 없음 2023.10.12

RecyclerView Compose로 마이그레이션 해보기 (1)

Mash-Up(Android)앱은 처음에는 xml로 개발했지만 새로 추가되는 기능은 Compose를 사용해서 개발하고 있고, 그 과정에서 일부 단순한 화면을 Compose로 변환하는 작업도 틈틈히 진행 중이다. 🗺 작업 계획 이번에 작업하게 된 내용은 “마이페이지 개선”이다. 그런데 이번에는 단순한 화면이 아닌 Full RecyclerView였던 화면을 개선하게 되었고 그 과정에서 ViewHolder가 추가되어야 했다. (새로운 화면은 Compose로 만들고 있음) 그래서 이 참에 새롭게 만들어야하는 "활동카드 ViewHolder"는 우선 Compose로 만들고, 다른 ViewHolder들도 Compose로 하나씩 바꿔 볼 예정이다. 그리고 최종적으로는 마이페이지 전체가 Compose화면이 되는 것이 목..

Android Launch Mode 및 Flag 알아보기

딥링크 이동 로직을 개선하던 중, 단순 화면 이동이 아니라 onNewIntent, Launch Mode를 활용하는 Task 관리를 마주하게 되었다. 딥링크 이동 로직을 수정하기 위해서는 앱 전체의 이동 로직을 수정해야 했기에 함부로 수정하기가 무서워서 우선 onNewIntent와 Launch Mode에 대해 알아보기로 했다. 😅 onNewIntent 보통 화면 전환을 할 때 아래와 같은 코드를 사용한다. val intent = Intent(this, MainActivity::class.java) startActivity(intent) 그런데 동일한 액티비티를 계속 startActivity() 메서드로 호출하게 되면 동일한 액티비티가 메모리에 여러 개 만들어지게 된다. 이를 방지하기 위해서 Flag(플래그..

카테고리 없음 2023.05.31

Firebase 핸드폰 번호 인증 관련 GooglePlay 대응기

약 1년동안 진행했던 사이드 프로젝트가 드디어 릴리즈를 하게 되었다. 🥳 구글 플레이 스토어에 올리기위해 앱을 release 빌드를 했는데 이게 무슨 일이지?! 지금까지 별다른 문제가 없었던 Firebase Auth 부분이 뭔가 이상했다. 첫번째 문제. 핸드폰 번호 인증 문자가 오지 않는다.. 보통 핸드폰 번호 인증을 보내면 늦어도 1-2분 후에는 문자 메시지가 왔는데 Release 빌드된 앱으로 인증을 보내면 아무리 기다려도 문자가 오지 않는 것이다. 😱 심지어 에러도 안 뱉음..ㅠㅠ (더 골때리는건 똑같은 버전을 Debug로 빌드했을 때는 정상적으로 문자가 온다…) 여러가지 이유를 생각해보다가 내가 추리했던 것들은 1) 난독화가 잘못 되었나? 2) Firebase에 릴리즈 관련 설정을 해줘야 하나? ..

Android 2023.03.16

Kotlinx Serialization의 JsonBuilder Properties 알아보기

프로젝트에서 서버 통신 후 받은 Response를 문자열(String)으로 웹뷰에 전달해야하는 일이 있어서 kotlinx-serialization의 StringFormat.encodeToString(value: T): String을 사용했다. 그런데 서버에서 전달된 값이 객체에 잘 저장이 되고 있었음에도 불구하고 encodeToString를 하면 키-값이 모두 사라져있는 것이었다. 😱 // 이런 상황이었다. (예시) @Serializable data class Foo( val a: Int = 0, val b: Int = 0, ) val response = Foo(a = 42, b = 0) Json.encodeToString(response) // {"a": 42} // 오잉 b는 어디갔지 ㄴㅇㄱ ?? 결..

Kotlin 2023.02.23

Kotlin Delegation 알아보기(1) - Delegated Class

안드로이드 개발을 하면서 by lazy {} , by remember {} 등 by 키워드를 자주 사용하고 있었다. 그런데 by 키워드가 Kotlin Delegation을 위한 문법이라는 것을 알고 있었지만, Delegation(위임)이라는 것에 대해 제대로 알고 있지 않다는 생각이 들어서 이번 기회에 알아보려고 한다. 👀 어떨 때 상속 대신 위임을 써야할까? 상속과 위임은 모두 객체지향 프로그래밍에서 사용되는 디자인 패턴으로, 두 방식 모두 클래스를 다른 클래스로부터 확장한다. 차이점을 살펴보자면 상속은 해당 클래스에 귀속되는 것이기 때문에 클래스가 다른 클래스들 사이에서 선택할 권한을 주지 않는다. 반면 위임은 객체 자신이 처리해야 할 일을 다른 클래스 인스턴스에게 위임할 수 있는 것이기 때문에 상속..

Kotlin 2023.02.16

새로운 버전의 로그캣 등장, 5가지 꿀기능을 알아보자!

새로운 버전의 로그캣?! 😺 회사 안드로이드 스튜디오를 Electric Eel로 업데이트 했다. 꽤 많은 것들이 바뀌어 있었는데, 그 중에서도 Logcat이 특히 많은 변화가 있었던 것 같다. 디자인부터 굉장히 화려해진 느낌.. ◟(ᵔ ̮ ᵔ)͜💐 찾아보니 새로운 버전의 로그캣이 등장했다고 하는데... 새로운 버전의 로그캣은 이미 Dolphin 버전부터 적용되어 있었고, Dolphin에서는 Experimental Feature였어서 따로 설정을 통해 새 버전을 사용할 수 있었다고 한다. 그리고 내 Android Studio 버전인 Electric Eel(2022.01)부터는 새로운 로그캣이 기본 값이 Android Studio Dolphin 에서 새로운 버전의 로그캣을 사용하려면 Settings > Ex..

Android 2023.02.01

Jetpack Compose State 정리

Jetpack Compose는 리액티브한 프레임워크다. 그래서 UI를 변경하기 위해서 setText()나 setColor() 같은 함수를 부르지 않고, 상태를 변경해주면 UI도 자동으로 변경된다. 그럼 컴포즈는 UI 상태가 변했음을 어떻게 인식할까? 바로 Jetpack Compose State Object를 사용하는 것이다. 이번 글에서는 바로 이 State에 대해 알아본 것을 정리해봐야겠다. ദ്ദി˙∇˙)ว 💡 Jetpack Compose에서 상태(State)란? Jetpack Compose에서 상태란 UI의 업데이트와 관련있다. 위에서 언급한 것 처럼 상태 값이 변경될 때 마다 UI가 업데이트되기 때문이다. 상태 값은 어떤 타입이든 될 수 있다. Boolean, String 같은 단순한 값일 수도 ..

Firebase Crashlytics 적용하기

작년 여름부터 진행하던 사이드 프로젝트가 드디어 어느정도 마무리 되었다. 그래서 사이드 프로젝트를 스토어에 올리기 전에 Firebase Crashlytics를 적용하려고 한다. Firebase Crashlytics에 대해 간단히 소개하자면 “앱이 비정상적으로 종료되었을 때 개발자에게 알려주는 일종의 오류 보고 도구”이다. 그리고 공식 문서에서는 아래와 같이 소개한다. 실시간 비정상 종료 보고 도구인 Firebase Crashlytics는 실제 사용자에 미치는 영향을 기반으로 가장 심각한 비정상 종료의 우선순위를 지정하고 문제를 해결하는 데 도움을 줍니다. https://firebase.google.com/products/crashlytics?hl=ko Firebase Crashlytics | 강력한 An..

Android 2022.12.08

안드로이드 접근성 - 대체 텍스트를 적용해보자!

📱 접근성이란 모바일 접근성이란 웹 접근성과 같은 개념으로 장애를 가진 사람이든 일반인이든 구애를 받지 않고 동등하게 정보에 접근할 수 있도록 설계하고 디자인/개발하는 것을 의미한다. 즉, 모두에게 유용하게 사용되는 앱이 되기 위해서는 접근성 처리가 필요하다. 안드로이드에서는 “TalkBack”, “시인성 향상”, “청각보조” 등 다양한 방법으로 접근성을 제공하고 있는데 이번 글에서는 그 중에서도 대체 텍스트(talkback)를 통해 음성 피드백을 제공할 수 있는 방법을 알아보겠다. ꈍꈊꈍ 🗣 TalkBack이란? TalkBack은 Android 기기에 포함된 Google 스크린 리더입니다. TalkBack을 사용하면 기기를 보지 않고도 제어할 수 있습니다. 출처: https://support.googl..

Android 2022.11.22