⛏️ | 개발 기록34 [Android, Kotlin] 모든 파일에 대한 접근 권한 부여 방법(모든 Android 버전 대응) 모든 파일 접근 권한 설정 부여(Android 11 이상 대응) 서론지난 포스팅에서 언급한 대로 이번 포스팅은 미리 사용하게 될 기술들을 간단히 개발하면서 검증하는 과정에서 블로그에 올리면 좋을 것 같아서 포스팅으로 올리게 되었다.이번 포스팅에서는 저장소 권한 부여 기능을 검증하면서 겪은 시행착오와 적용 방법에 대해 설명해 보겠다. 저장소 권한텍스트 추출기 앱은 txt를 합성하는 게 핵심 기능이 될 듯해서 기존에 사용자가 가지고 있던 txt까지 불러와 합성할 수 있도록 하는 게 매우 중요했다.그래서 모든 파일을 불러올 수 있는 권한이 필요하게 되었는데, 이 권한이 Android 10(API 29)에 올라오면서 변경되게 되었다고 한다. 기존에는 개발자가 WRITE_EXTERNAL_STORAGE, REA.. 2025. 5. 28. [기획] 텍스트 추출기 앱 설계 텍스트 추출기 앱 기획 서론Planner 앱 출시 이후, 군대 가기 전에 앱 하나 더 출시하고 가자는 생각에 아이디어를 몰색하다가 텍스트 추출기 앱을 떠올리게 되었다.이번 포스팅에서는 텍스트 추출기 앱을 떠올리게 된 아이디어와 어떤 기능을 담을 건지 간단하게 작성해보고자 한다. 아이디어 선정전부터 웹소설을 보던 것을 즐겼었다.웹소설 플랫폼은 네트워크가 안 통하는 지역에서는 사용이 불가하기 때문에 텍스트로 따 저장하는 텍본이라는 방식으로 웹소설을 즐기는 사람이 많다.텍본으로 자신이 재미있게 본 웹소설을 저장하려고 만드는 사람들도 많다. 나도 내가 재미있게 본 웹소설들을 텍본으로 만들고 싶었다.pc에서 하는 방법은 많이 나와 있었지만, 모바일에서 하는 방법은 많이 나와있지 않았다.그래서 OCR(광학 문자.. 2025. 5. 27. [후기] Planner 앱 출시 후 회고 Planner 출시 후기 서론공군 준비를 하면서 꽤 길게 블로그 휴식기를 가졌다.사실은 공군 준비를 하면서 개발하기 귀찮음이 더 커서 블로그에 쓸 게 없어서 블로그를 안 쓰게 되었던 것 같다.최근에 공군 모집병 최종 합격(7월 말 입대)하면서 마지막 불꽃을 태워 앱을 출시해 보고 가겠다고 마음을 먹어서 기존에 다 만들어 놓고 출시를 안 하고 있던 Planner를 기능적, UI적으로 손을 보고 비공개 테스트를 거쳐서 출시하는 데 성공했다. 이번 글에는 출시하기까지의 과정을 간략히 설명하고 출시 후기를 남겨볼까 한다. Planner 출시 완료Planner를 손보고 나서 비공개 테스트를 어떻게 할지 찾아보다가, 비공개 테스트를 위한 오픈 채팅방을 찾게 되었다.바로 들어가서 비공개 테스트를 진행했다. 내가 .. 2025. 5. 27. [Android] ConstraintLayout GuildLine으로 화면 구성하기 부트캠프 최종 팀 프로젝트 기록 12 서론지난 포스팅의 splash screen 구현 이후, 다양한 오류들을 해결하고 있는 중이다.지금까지 로그인에서 로그인 진행 후 main으로 이동하지 않은 오류를 해결하면서 로그인 진행 중 circular progress bar를 띄우는 디테일 작업을 진행하였고,Android 12 이하의 버전에서는 splash screen dependency가 잘 작동하지 않는 문제가 있어서 Activity로 splash screen을 구성하고, 로그인 기능을 약간 손보는 작업을 진행했다.위 2가지의 작업은 포스팅으로 쓰기에는 애매한 감이 있었는데, 이번에 한 것은 포스팅으로 쓰기 좋은 것 같아서 이번에 작성해보려 한다. 이번에는 settings 화면을 구현하였다.myPage에 들.. 2024. 9. 23. [Android] SplashScreen Api를 이용해 로그인 여부 확인 부트캠프 최종 팀 프로젝트 기록 11 서론오늘의 구현 기능은 자동 로그인 기능이다.Firebase Authentication을 사용 중이기 때문에 현재 FirebaseAuth의 currentUser.uid가 null이 아니면 사용자가 로그인되어 있다는 뜻이기 때문에 이 경우에는 MainActivity로 이동하고, 아닐 때는 로그인이 필요하기 때문에 SignInActivity로 이동하게 하는 기능이다.이 기능은 현재 구현이 되어 있지만, SignInActivity의 onStart lifeCycle 함수에 구현되어 있기 때문에 사용자가 이미 로그인을 했어도 SignInActivity를 보고 MainActivity로 넘어가게 되는 아주 사소한 이슈가 있다.이 이슈를 해결하기 위해 Android 12부터 사용.. 2024. 9. 17. [Android] Firebase Google One-Tap login으로 마이그레이션 부트캠프 최종 팀 프로젝트 기록 10 서론이번에 코드 수정 사항을 스캔하다가 눈에 보이는 것을 발견했다.바로 GoogleSignIn, GoogleSignInClient가 deprecated 되어 있는 것을 발견했다. 이와 관련해서 자료를 찾아보다가 Google에 새로 출시한 one-tap sign in이라는 것을 발견했다.이 로그인 방법은 기존의 방법에 비해 다양한 장점을 가진다.한 번의 클릭으로 로그인이 가능하다.새 사용자는 앱 안에서 쉽게 계정을 만들 수 있다.기존의 비밀번호에 의존하는 방식의 로그인이 아니기 때문에 관련 보안 위협을 줄일 수 있다.개발하는 입장에서도 기존의 방식보다 코드가 간소화되어서 편리해진다.위와 같은 장점이 있는데 안 쓸 이유가 없지 않은가?바로 사용해 보자. Google .. 2024. 9. 13. [Android] Kakao Login을 Firebase Authentication과 연결 부트캠프 최종 팀 프로젝트 기록 9 서론지난 포스팅과 연결된다.https://rkdrkd-history.tistory.com/244 [Node.js] Intellij, Vscode에서 Firebase Functions 개발을 위한 Node.js 프로젝트 세팅부트캠프 최종 프로젝트 기록 7 서론현재 kakao 로그인 기능을 구현하려 하고 있다.kakao login을 그냥 구현하는 게 아닌 firebase authentication과 연동해서 사용하려 한다.그러기 위해서는 firebase functiorkdrkd-history.tistory.com 지난 포스팅에는 firebase functions 개발을 위한 node js 환경 세팅까지 진행했다.오늘은 android에서 구현한 firebase funct.. 2024. 9. 12. [Node.js] Intellij, Vscode에서 Firebase Functions 개발을 위한 Node.js 프로젝트 세팅 부트캠프 최종 프로젝트 기록 8 서론현재 kakao 로그인 기능을 구현하려 하고 있다.kakao login을 그냥 구현하는 게 아닌 firebase authentication과 연동해서 사용하려 한다.그러기 위해서는 firebase functions라는 기능을 사용해야 하는데, firebase functions를 만들기 위해 node.js 세팅을 해주어야 한다.vscode로 하는 방법이 가장 대중적이지만, 나는 intellij idea에서 진행해보려 한다.vscode로도 똑같이 따라서 하면 된다. Node.js 프로젝트 세팅node.js 설치는 아래의 사이트에서 진행해 주면 된다.https://nodejs.org/en Node.js — Run JavaScript EverywhereNode.js® is.. 2024. 9. 11. [Android] 앱 서비스 출시를 위한 개인정보처리방침 및 이용약관 작성하기 부트캠프 최종 팀 프로젝트 기록 7 서론이번 포스팅은 크게 뭐는 없고 이제 MVP를 구현해서 version 1.0.0의 출시를 앞둔 상태이다.출시를 앞둔 상황이면 필연적으로 개인정보처리방침과 이용약관이 필요하게 되는데, 이를 빠르게 작성하는 사이트의 사용 방법에 대해 간단하게 알려주고자 한다. 개인정보처리방침 및 이용약관 등 문서 자동 생성 사이트, Law form개인정보처리방침 및 이용 약관 등 문서를 자동으로 생성하는 사이트로는 law form을 사용하였다.https://lawform.io/ 국내 유일 법률문서 자동작성 · 서명 · 통합 관리 플랫폼모바일에서도 쉽고 간편하게 법률문서 자동작성 및 원스톱 전자서명 가능! 실시간 온라인 공유/수정으로 업무 효율은 UP! 클라우드 기반의 안전한 보관/관.. 2024. 9. 9. [Android] runnable, handler를 이용해 현재 열려 있는 앱 감지 부트캠프 최종 팀 프로젝트 기록 6 서론이번에는 내가 맡은 기능의 마지막 기능인 허용 앱에 들어갔을 때, 다른 앱을 실행하게 되면 그걸 감지해서 overlay를 띄워주는 기능을 구현할 것이다.다른 앱을 실행하고 나면, 기존의 화면은 background 상태에서 계속 돌아간다는 점을 이용해서 별도의 Thread를 만들어서 현재 열려 있는 앱의 package name을 불러오는 작업을 진행할 것이다. 허용 앱을 실행했을 때, 다른 앱 실행 감지 기능 구현하기다른 앱 실행 감지를 위해서는 usageStatsManager를 이용해서 특정 기간 내의 앱 실행 기록을 구할 수 있다.실행 기록을 가져오는 함수를 만들고, 그 함수를 별도의 Thread에서 반복시켜서 실시간으로 현재 실행되어 있는 앱의 package.. 2024. 9. 5. [Android] android에서 firestore의 데이터 업데이트 및 countdown timer 사용 부트캠프 최종 팀 프로젝트 기록 5 서론이번에 구현할 기능은 앱에서 다른 허용 앱을 실행했을 때, 사용 시간을 카운트다운 타이머로 측정 후, 우리 앱으로 복귀하면 남은 시간을 fireStore에 업데이트하는 기능을 만들어 보았다. fireStore 데이터 업데이트fireStore 데이터를 불러오기 전에 먼저 카운트다운 타이머를 사용해서 앱의 사용 시간을 구해줄 것이다.먼저 허용 앱을 실행하게 되면, 허용 앱을 여는 동시에 타이머를 작동시켜서 사용 시간을 측정한다. 초기 시작 시간은 각 허용 앱에 설정된 시간(제한 시간)으로 지정한다.허용 앱을 사용하다가 우리 앱으로 돌아오게 되면, 타이머를 멈추고 타이머에 남은 시간을 fireStore에 업데이트한다.허용 앱을 쓰는데 제한 시간이 종료되었는데 우리 앱.. 2024. 9. 3. [Android] clean architecture에 firebase 로직 적용하기 부트캠프 최종 팀 프로젝트 기록 4 서론팀원들과 UI 구성을 마무리 짓고 이제 본격적으로 기능 구현에 돌입했다.내가 맡은 기능은 디톡스 타이머가 작동 중일 때, 실행이 가능한 허용 앱들을 불러와서 정해진 시간만큼만 사용할 수 있도록 구현하는 것이다.정해진 시간만큼 사용하는 기능을 구현하기 전에, 실행이 가능한 앱들을 firestore에서 불러오는 작업을 먼저 진행하겠다. fireStore 로직을 clean architecture로 구현하기clean architecture의 구조는 이 포스팅을 보는 사람들을 다 어느 정도는 알고 있다는 가정하에 간단하게 설명하겠다.clean architecture는 data, domain, presentation 계층으로 나뉘어 있고data에는 데이터를 저장할 data.. 2024. 8. 30. [Android] custom NumberPicker를 string array와 함께 사용하기 내일배움캠프 최종 프로젝트 기록 3 서론어제까지는 BottomSheet의 height를 설정하기 위해 삽질한 것을 포스팅했는데,오늘은 Bottom Sheet에 NumberPicker를 써서 구현한 것을 포스팅해보려 한다.추가적으로 NumberPicker에 string.xml에서 정의한 string array도 함께 사용했다. NumberPicker 구현우선은 NumberPicker에 사용할 전용 Theme를 만들어 보겠다.NumberPicker에서는 Picker의 text의 색과 size 등등 몇 개의 설정이 불가하기 때문에, Theme로 구현해 줘야 한다.textColor와 size 설정은 1, 2번째 줄에서 이루어지고, colorControlNormal은 NumberPicker에서 선택된 항목과 .. 2024. 8. 28. [Android] Android에서 BottomSheetDialogFragment의 높이를 최대 높이로 설정하기 내일배움캠프 최종 프로젝트 기록 2 서론이번에는 UI 개발을 할 차례이다.나는 UI개발에서 마이페이지에 사용하는 bottomSheet들의 UI 구성을 맡았다.그리고 이미 구현되어 있는 bottomSheet 틀을 사용해서 구현할 것이다.sheet 틀은 xml로 이미 구현되어 있고, content 부분만 따로 xml로 구현해서 붙여주는 작업을 진행했다.bottomSheet UI의 height 설정 부분에서 삽질을 했던 과정을 글로 적어 보겠다. BottomSheet를 최대 높이로 설정해서 만들기기존에는 BottomSheet를 최대 높이로 설정해서 띄우려면 BottomSheetBehavior를 사용해야 했다.원래 BottomSheetBehavior를 사용해도 되지만, bottomSheetDialogFrag.. 2024. 8. 27. [Android] Android의 Gitignore 설정으로 commit 제한하기 내일배움캠프 최종 프로젝트 기록 1 서론이제 기획이 어느 정도 마무리되고 본격적으로 개발을 시작한다.프로젝트의 주제는 cosmic detox로, 우주를 콘셉트로 하는 디지털 디톡스 앱을 만들기로 했다.그전에 먼저 초기 세팅을 진행하고 있다. 내가 맡은 초기 세팅은 패키지 구성 및 gitignore 설정, firebase와의 연결이다.그중에서 gitignore 설정 관련해서 포스팅을 남겨 보려 한다.이 포스팅에는 gitignore 설정 및 적용 방법을 적어 보겠다. Gitignore.gitignore 파일은 commit 되는 모든 파일들 중에 특정한 파일들을 commit에서 제외시켜 버리는 역할을 하는 파일이다.gitignore 파일을 이용해 프로젝트에서 안 쓰이는 파일들을 제외시켜서 버전 관리를 용이.. 2024. 8. 26. [Android] RecyclerView의 Infinite scroll 적용하기 (2) 내일배움캠프 앱 개발 심화 팀 프로젝트 서론대부분의 API들은 수많은 검색결과를 불러와야 할 때, 한 번에 불러오는 게 아닌, page query 파라미터를 추가로 이용해서 조금씩 데이터를 불러오도록 처리한다.이런 형식으로 데이터를 불러오는 이유는 많은 데이터를 여러 페이지로 나누어서 로딩 속도를 개선하고 사용성을 좋게 하기 위해서이다.이는 기본적인 내용이긴 하지만 그냥 써봤다. page 파라미터로 나뉘어 있는 검색결과들을 Android에 무한 스크롤을 적용해서 끝없는 데이터를 계속 불러올 수 있도록 만들어 보자. 무한 스크롤무한 스크롤은 우리가 자주 사용하는 instagram, youtube처럼 스크롤을 계속 내려도 데이터가 계속 나오는 것을 뜻한다.무한 스크롤을 구현하기 위해서는 첫 데이터가 re.. 2024. 8. 19. [Android] ViewModel과 UiState를 이용해 상황에 맞는 화면 띄우기 (1) 내일배움캠프 앱 개발 심화 팀 프로젝트 서론이제 본격적으로 부트캠프에서 앱 개발하고 나서 발생한 문제의 해결 과정과 새로 알게 된 기능 정리 및 알고 있던 개념 복습 차원에서 개발 기록 포스팅을 남기도록 하겠다.기능 개발이 끝나고 나서 포스팅을 작성할 것이기 때문에 매일 올라오지는 않는다 :) UiState란?uiState는 자신이 직접 state를 만들어서 현재 앱이 어떤 상태인지 직접적으로 알 수 있게 해주는 역할을 한다.대체로 UiState는 sealed class를 이용해서 구현한다.sealed class SearchUiState { data class Success(val searchResultModel: SearchResultModel): SearchUiState() data ob.. 2024. 8. 16. [Android, Kotlin] 카테고리 기능 구현 (17) 이번 포스팅에서는 마지막 기능인 카테고리 기능을 구현한 것에 대해 포스팅을 하려고 한다.꽤나 오래 걸렸는데, 내가 천천히 개발한 것도 있고 카테고리를 만들면서 다른 UI적 요소와 기능들이 추가되어야 했기 때문에 오래 걸렸던 것 같다. 바로 내가 어떻게 카테고리 기능을 구현했는지 간단하게 알아보도록 하자.간단히 알아볼 예정이라 코드에 대한 설명이 미흡할 수 있다..! 1. 카테고리 화면 생성우선은 먼저 카테고리 화면을 생성해 주었다.카테고리 화면에서는 자신이 생성한 모든 카테고리를 볼 수 있고, 카테고리를 수정하거나 삭제할 수 있도록 만들어 주었다. @Composablefun CategoryScreen(categoryViewModel: CategoryViewModel = viewModel()) { . . .. 2024. 5. 11. [Android, Kotlin] 일정 item에 menu 추가해서 일정 수정하기 기능 추가하기 (16) 이번에 만들 기능은 일정 추가 기능이다. 일정 수정을 일정 생성할 때 할 수 있었는데, 이를 생성하고 나서도 수정할 수 있게 만들어야 나중에 일정 생성하고도 수정사항이 있을 때, 일정을 새로 생성해야 하는 불편함을 줄일 수 있을 것 같았다. 그러면 바로 만들어 볼까? 1. 설계 우선은 일정 수정 기능을 어떻게 만들지 생각해야 한다. 일단 바로 생각난 것은 더보기 아이콘을 이용한 dropdown menu를 생성하는 것이었다. 일정 정보 item의 오른쪽 끝에 더보기 아이콘을 넣어서 더보기 icon을 클릭하면 dropdown menu를 열어서 일정 수정하기 기능을 만드려고 했었는데.... dropdown menu 특성상 커스텀이 어려웠고, 막상 적용해 보았는데 생각보다 안 어울려서 내가 따로 menu를 만들.. 2024. 4. 19. [Android, Kotlin] SwipeToDismiss을 이용한 밀어서 삭제하는 기능 구현하기 (15) 이번 포스팅에서는 LazyColumn 안에 SwipeToDismiss을 이용해 옆으로 밀어서 일정을 삭제할 수 있도록 하는 기능을 구현해 보겠다. SwipeToDismiss는 생각보다 많이 어렵지는 않았기에 이 글을 보고 나서 쉽게 사용할 수 있을 것이라고 생각한다. 그러면 바로 어떻게 사용하는지 알아보자. 참고로 따로 dependency를 설치할 필요는 없다. compose 기본 dependency에서 모두 지원되는 기능들이다. 1. dismissState 생성 SwipeToDismiss를 이용하기 위해서는 dismissState 데이터가 필요하다. dismissState는 사용자가 item을 옆으로 밀었을 때를 감지하는 역할을 한다. val dismissState = rememberDismissSta.. 2024. 4. 16. [Android, Kotlin] 통계 화면 구성하기 (14) 이번에 드디어 통계 화면 구현을 마무리 짓게 되었다. firebase realtime database를 썼을 때는 어떻게 구현해야 할까 막막했는데 firestore로 구현하니까 firestore에 내장된 필터 덕분에 따로 차트용 collection을 만들 필요 없이 하나의 collection으로 해결했다. 그러면 바로 통계 화면을 제작하면서 겪었던 시행착오들을 알아보자. 1. 통계 화면 ui 요소 추가 이번에 planner를 만들면서 통계 화면에 차트 2개(이번 주 일정, 주간 일정)만 있는 건 너무 심심해 보여서 ui 요소도 추가하고 차트 데이터도 바꾸기로 했다. 이번 주 일정을 보여주는 차트는 현재 날짜를 기준으로 그 주에 생성한 일정과 완료한 일정 2개의 데이터를 보여주는 차트였다. 다양한 데이터가.. 2024. 4. 14. 이전 1 2 다음 728x90 반응형