일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- sharedFlow
- 뷰
- coroutine
- 알고리즘
- Compose
- UiState
- 플레이스토어
- 회원가입
- Jetpack
- 컴포즈
- Kotlin
- 안드로이드
- cleanarchitecture
- NavHost
- Flow
- 코딩테스트
- Authentication
- 리사이클러뷰
- NavController
- MVVM
- ListAdapter
- 파이어베이스
- 커스텀뷰
- 클린아키텍처
- DiffUtil
- Build variants
- XML
- Android
- 코틀린
- 로그인
- Today
- Total
목록안드로이드 개발 (45)
Grusie 안드로이드 개발 기술 블로그
개인이나 사이드프로젝트를 진행하면서는 사용해 본 적이 없으나, 회사 프로젝트를 진행할 때, 업데이트를 테스트 하거나 이전 버전이 필요한 경우가 있어서 사용하게 되었다.사실 svn에 버전별로 commit해두어서 버전을 바꾸어 빌드할 수도 있으나, aab파일을 물리 보관하고 있기 때문에 aab를 apk로 변경해서 하는 것이 더 수월하다. 우선 기본 세팅을 몇 개 해야할 게 있다.1. bundletool 다운로드https://github.com/google/bundletool/releases Releases · google/bundletoolBundletool is a command-line tool to manipulate Android App Bundles - google/bundletoolgithub.c..
글라이드를 사용하여 갤러리 이미지들을 로드하는 중에, 다른 분의 휴대폰에서 이미지가 뜨지 않는 것을 확인하였다.Shimmer는 잘 나오기 때문에 처음에는 속도 문제인가 생각하였으나 아예 안 뜨는 것을 보고 로그를 찍어보았다. 결론은 해당 기기는 갤럭시 노트9 안드로이드 OS10에 One Ui 2.5를 가진 기기였으며, 검색결과 OS10에서 해당 에러가 발생한다는 것을 알게 되었다. java.io.FileNotFoundException(open failed: EACCES (Permission denied))해결법 ... 안드로이드 Manifest 파일에 application 내부에 레거시한 외부스토리지 접근요청을 허용한다는 의미인 것 같다.이 코드를 작성하고 다시 실행시켜 보니 문제 없이 ..
지난 번에 추가로, Build Variants에 대한 얘기이다.Release 버전을 테스트 할 수 있다는 것은 지난 번에 사용해보았으며, 주의해야 하는 추가 사항들이 좀 있어서 이번에는 Debug버전과 Release버전 앱이 따로 설치되도록 하면서 발생했던 문제점과, 처리과정에 대해 말해보겠다. 1. 파이어베이스의 google-services.json 처리2. File - Provider 사용 시 중복 처리3. 앱 이름 중복 처리 기본 세팅- 지난 번과 다를 거 없으나 설명을 하자면,debug / release를 구분하고 applicationIdSuffix를 사용하여 debug일 경우 패키지명이 변경되도록 수정하였다. 1. google-services.json파이어베이스의 기능들을 사용하기 위해서는 go..
회사 프로젝트에서는 release와 debug버전의 몇 가지 차이들이 존재했다. 예를 들어, proguard-rules를 활용한 난독화 차이가 있으며, 지난번에 발생했던, Json 난독화 오류에 대응하기 위해, proguard-rules를 수정한 경험이 있었다.하지만 이런 에러가 발생한다는 것은 플레이스토어 내부 테스트 버전을 배포하기 전까지 알지 못 하였고, 그 대로 배포를 했더라면 대참사가 날 뻔 했었다. 그렇기에, 개발단계에서 release버전을 테스트 해볼 수 있는 방법이 없을까? 하는 고민을 하며 찾던 중, Build Variants라는 것을 알게 되었고 실제로 빌드를 실행해보는 과정을 설명해보려고 한다. Build Variants는 기본적으로 이렇게 생겼다.프로젝트에 존재하는 모듈들을 띄워주..
기존 HiltViewModel을 사용했을 때에는 생성자에 의존성이 선언 되어있는 useCase들을 넘겨주는 형태로 사용하였으나, 생성자를 넣어주고 싶어 찾아보다 Assisted Inject에 대해 발견하게 되어 기록해보려고 한다. 사용법1. @HiltViewModel을 사용하지 않는다.2. 뷰모델의 constructor 앞에 @Inject를 @AssistedInject로 대체한다.3. 생성자에 들어갈 파라미터 중 런타임 오브젝트를 주입받는 파라미터에는 @Assisted 애너테이션을 넣는다.4. 생성자를 주입한 뷰모델을 리턴하는 뷰모델 팩토리를 선언한다.5. 뷰에서 뷰모델 팩토리를 사용하여, 뷰모델을 생성한다. 직접 구현해보자class SlowMailBoxViewModel @AssistedInject co..
플로우이미지 리스트를 포함하여 서버통신을 하는 과정이 필요했으며, 중간에 임시저장을 할 수 있도록 구현 했어야 했다.추 후 임시저장 리스트를 통해 불러 올 수 있어야 했기에 이미지 저장은 필수였다.처음 생각은 origin 즉, 기본 이미지를 갤러리에서 가져오니, 그 uri를 그대로 저장하고, crop을 진행한 것들만 저장하면 되겠다고 생각하였다.하지만 고민을 해보다가, 만약 원본 이미지를 갤러리에서 삭제하면 어떻게 되는거지? 라는 물음에 도달해서, originImage도 저장하고, cropImage도 저장하게 되었다.저장은 앱의 내부 저장소를 이용할 것인데, 이미지가 계속 늘어나지 않도록, 화면을 종료하면 임시저장하지 않은 상태일 경우, 삭제하도록 구현하였다.하지만, 만약 임시저장이 되지 않은 상태로, ..
네이버 클라우드에서 제공하는 네이버맵 SDK를 사용했던 적이 몇 번 있었다.회사 프로젝트에서도 사용했었는데, 클러스터링을 적용하려고 보니, 지원을 하지 않아서 서드파티 라이브러리를 사용했던 기억이 있다.웹에서는 지원을 하는데, 앱에서는 지원을 안 해줘서 너무하다는 생각을 했었다.그러던 중 올해초에 클러스터링이 업데이트 되었다는 것을 보았고, 네이버 맵을 적용하게 될 기회가 또 생겨서 기록해보려고 한다. 우선 네이버맵을 화면에 표시하는 방법은 공식문서에 잘 나와 있기에 넘어가도록 하겠다.바로 커스텀 클러스터링으로 넘어가자 기본 사용법키 정의마커 클러스터링을 사용하기 위해서는 ClusteringKey 인터페이스를 구현한 클래스를 정의해야 한다.class ClusterItemKey(private val tra..
지난 번 만들었던 이미지 크롭 리스트들을, 리사이클러뷰에 DiffUtil을 활용하여 넣도록 구현하였다.베스트 컷, 퍼니 컷이라는 속성을 가진 이 아이템들을 각각 수정하거나 삭제할 수 있는 기능을 구현했어야 했다.우선 기존에 크롭 이미지는 뷰페이저로 만들어 각 프래그먼트에서 이미지를 크롭하고 캐시 디렉토리에 저장한 뒤, ActivityViewModels로 뷰모델을 공유해서 Activity에서 Intent시켜줄 때, Uri리스트를 전달하도록 구현하였다. 디자인우선 만들어야하는 뷰를 확인해보자, 넘어온 크롭 이미지 리스트를 화면에 뿌려주고, 베스트컷/퍼니컷을 선택 할 수 있도록 구현해야 하고, 햄버거 버튼을 클릭 하면 편집/삭제가 가능하도록 해야한다.편집하기/삭제하기는 popup으로 만들어서 화면에 띄워주는 ..