compose 8

안드로이드에서 CRC32로 무결성 체크하기

문제 상황펌웨어 업데이트나 블루투스 통신을 통해 데이터를 안전하게 전송하기 위해 CRC32를 사용하여 데이터의 무결성을 검사하려고 합니다. CRC32은 어떤 것이며, 안드로이드 앱에서 이를 어떻게 사용할 수 있는지 정리해 보겠습니다. 왜 CRC32를 사용해야하는가?CRC32는 데이터의 무결성을 검증하기 위한 체크섬 기법 중 하나입니다. 데이터가 전송 도중 변경되었는지 여부를 간단하게 확인할 수 있어, 데이터 손상을 감지하고 재전송 요구 없이 효율적으로 오류를 처리할 수 있습니다.체크섬(Checksum)은 주어진 데이터의 일부를 특정 알고리즘을 통해 계산하여 생성됩니다. 이 값은 데이터 블록이나 파일의 모든 비트를 고려하여 생성되며, 일반적으로 고유한 데이터 시그니처 역할을 합니다. 데이터가 손상되었는지 ..

질문 정리 2024.07.02

안드로이드 PDF 파일 저장하기 구현

문제 상황앱에서 PDF 파일을 저장하는 기능이 필요합니다. 안드로이드의 경우 버전에 따라서 필요한 권한과 사용 함수가 다르기 때문에 안드로이드 버전을 체크하고 다운로드 하는 기능을 구현해야합니다. 제 프로젝트는 minSdk가 26, targetSdk가 34이기 때문에 26 이상의 버전들에 대해서 처리해야합니다. 안드로이드 6 (API 레벨 23) 이상런타임 권한 요청: 파일 시스템에 접근하기 위해 사용자로부터 스토리지 접근 권한을 런타임에 요청해야 합니다. READ_EXTERNAL_STORAGE와 WRITE_EXTERNAL_STORAGE 권한이 필요합니다. 안드로이드 10 (API 레벨 29) 이상스코프드 스토리지 도입: 애플리케이션은 자신의 내부 저장소 또는 특정 유형의 파일(예: 사진, 비디오, 오디..

질문 정리 2024.06.28

컴포즈 블루투스 권한 없을 때 처리

문제 상황현재 블루투스 권한이 없을 때, 스캔을 시도하면 버튼을 눌러도 사용자에게 피드백이 없습니다. 요구 사항해당 기능을 사용하려고 할 때, 권한 체크를 수행하고 권한이 없을 경우, 다음의 조치를 취해야 합니다.이전에 권한 요청을 했다면권한이 필요한 이유를 팝업으로 표시설정으로 이동할 수 있는 버튼 제공이번이 권한 요청이 처음이면바로 권한을 요청 블루투스 통신을 위해 필요한 절차휴대폰 블루투스가 켜져 있는지 확인하기앱에서 블루투스 관련 권한 받기스캔하기기기 연결하기 블루투스 상태 모델앱에서 블루투스 상태관리를 위하여 다음의 모델을 사용했습니다.DISABLED: 사용자에게 블루투스를 활성화할 것을 요청합니다.PERMISSION_DENIED: 사용자가 필요한 권한을 부여하지 않았을 때, 설정으로 유도하여 ..

질문 정리 2024.06.27

Compose Snackbar 알림 관리를 위한 Utils

문제 상황HomeViewModel에 있는 message라는 변수를 통해서 snackbar를 관리하고 있습니다. 그런데 다른 뷰모델에서 api 통신시 발생하는 에러도 사용자에게 snackbar로 알려주고 싶어서, 뷰모델에 관련 없이 사용할 수 있도록 snackbar에 관련된 기능을 모아둔 유틸 파일을 하나 만들려고 합니다. SnackbarSnackbar는 Android 애플리케이션에서 사용자에게 간단한 메시지를 제공하는 데 사용되는 UI 요소입니다. Snackbar는 화면 하단에 잠시 나타났다 사라지는 방식으로, 사용자에게 피드백이나 안내 메시지를 제공할 때 유용합니다. 이는 사용자가 현재 작업 중에 다른 화면으로 이동하지 않고도 정보를 받을 수 있도록 합니다.Snackbar.make(view, "Item..

질문 정리 2024.06.20

Compose BackHander, 앱 종료가 안되는 이유

문제 상황테스트를 하는데, 앱 종료가 불가능한 오류를 발견했습니다. 문제의 원인은 다음 코드에서 확인할 수 있습니다. 과거에 작성한 BackHandler의 enabled 조건이 문제였습니다.navController = rememberNavController()BackHandler( enabled = navController.currentBackStackEntryAsState().value?.destination?.id != navController.graph.startDestinationId,) { navController.popBackStack()} 위 코드에 따르면 BackHandler 컴포넌트는 NavController의 현재 백스택 항목이 시작 목적지가 아닐 때만 활성화됩니다. 따라서 ..

질문 정리 2024.06.05

안드로이드 컴포즈 페이스북 로그인 연동 정리

1. 필요한 의존성 추가프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다.plugins { id("com.android.application") version "8.1.1" apply false id("org.jetbrains.kotlin.android") version "1.8.10" apply false id("com.google.dagger.hilt.android") version "2.45" apply false id("com.google.gms.google-services") version "4.4.0" apply false id("com.google.firebase.crashlytics") version "2.9.9" apply false}plugi..

질문 정리 2024.05.26

위임하는 방식(By)과 직접 할당하는 방식(=)의 차이는 무엇일까?

현재 프로젝트의 마감일이 가까워짐에 따라 코드를 점검하는 과정에서 다음의 방식을 혼용하고 있음을 알게 되었습니다.val a = getSurveyViewModel.a.collectAsState().valueval a by getSurveyViewModel.a.collectAsState()val a by viewModel.a.collectAsState()이 구문에서 by 키워드는 위임(delegate)을 의미합니다.collectAsState()는 Flow를 State로 변환하는 함수입니다. 이 함수는 Compose에서 상태(State)를 구독(subscribe)하고 UI를 다시 렌더링할 수 있게 해줍니다.by 키워드를 사용하면 State 객체를 a 변수에 위임하여, a 를 직접 State 객체처럼 사용할 수..

질문 정리 2024.05.24

안드로이드 컴포즈 구글 로그인 연동 정리

1. Google Service 추가프로젝트의 build.gradle 파일에 Google 서비스 플러그인과 Google 로그인 라이브러리를 추가해야합니다.// Project-level build.gradleplugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("com.google.gms.google-services")}dependencies { //firebase implementation(platform("com.google.firebase:firebase-bom:32.7.0")) implementation("com.google.firebase:firebase-analytics")..

질문 정리 2024.04.28