기본 콘텐츠로 건너뛰기

개발일기 #10 진행율 표시는 어떻게 progressbar 만들기

원본출처: 티스토리 바로가기 진행률 앱을 구현하다 보면 간혹은 화면을 전환하는 동안에 진행률(progressbar) 표시를 통해서 사용자와 소통(?)을 해 보고자 하는 경우가 있습니다.  이런 경우 어떻게 할 것인지를 찾아보면서 이번 포스팅을 정리하고자 합니다.    https://www.jetpackcompose.net/jetpack-compose-progress-indicator-progressbar   Jetpack Compose Progress Indicator (Progressbar) In Jetpack Compose, Progress Indicator is a widget to indicate some actions are in progress to the user. Types of Progress Indicators available in Jetpack Compose LinearProgressIndicator CircularProgressIndicator For long-time operations such as file downl www.jetpackcompose.net 참조했던 내용의 링크를 먼저 올려 둡니다.  이번 구현의 위 링크의 내용을 참조했습니다.   구현 샘플 미리 보기 linear progressbar 표시 동작하는 영상은 4초가량인데, 시작하면서 바로 '합계=' 아래에 linear progressbar 가 흘러가는 모양을 볼 수 있습니다.    import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.*

개발일기 #9 : 실시간 카메라 권한 획득 방법 Jetpack Compose

원본출처: 티스토리 바로가기 CAMERA Permission 앱에서 카메라 권한을 획득해야 하는 경우가 종종 발생합니다. 예전에는 앱이 시작되는 시점에 모든 권한을 획득하고 시작을 했지만, 요즘은 실제 행위가 발생하는 시점에 권한 획득을 하도록 유도하고 있습니다.  <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> 항상 그렇지만, manifest 파일에는 위와 같은 권한을 선언해 둡니다.  그래야 다음 동작을 구현할 때 오류가 발생하지 않습니다.  다음은 gradle 파일에 권한 획득을 위한 라이브러리를 가져올 수 있도록 구현합니다.  dependencies { ..... // 권한 획득 implementation "com.google.accompanist:accompanist-permissions:0.27.0" ..... } 이제 구현된 코드를 보도록 하겠습니다.  @OptIn(ExperimentalPermissionsApi::class) @Composable private fun FeatureThatRequiresCameraPermission( doResult:(ty:Boolean) -> Unit ) { // Camera permission state val cameraPermissionState = rememberPermissionState( Manifest.permission.CAMERA ) when (cameraPermissionState.status) { // If the camera permission is granted, then show sc

개발일기#7 crashlytics:18.3.0 에 오류?

원본출처: 티스토리 바로가기 https://github.com/firebase/firebase-android-sdk/issues/4223   Missing class com.google.android.datatransport.runtime.ForcedSender in Crashlytics 18.3.0 · Issue #4223 · firebase/firebase-an Android Studio version: Android Studio Dolphin | 2021.3.1 Patch 1 Firebase Component: Crashlytics Component version: 18.3.0 Describe the problem If a crash occurs within the Android app (e.g. by th... github.com 위에 나와 있는 글을 읽어 보면  firebase에서 오류 감지를 위해서 사용하고 있는 API에 오류가 있는 것처럼 보입니다. crashlytics는 firebase에서 제공하는 API 중에서 앱의 오류를 감지합니다.  playstore 에도 릴리즈 된 앱의 경우는 그 내용이 감지되어 알려 주기는 하지만, firebase의 경우는 조금 더 상세하게 알게 되는 것 같아서 사용하는 중입니다. 위 링크 글에서 보는 것처럼 최종 버전인 것 같은 18.3.0은 사용을 보류하고 18.2.3으로 당분간은 유지를 해지 않나 하는 생각을 하면서 이 글을  정리해 봅니다. 관련이미지 --- 아래 내용은 링크된 글의 번역한 내용입니다. --- 문제 설명 Android 앱 내에서 충돌이 발생하는 경우(예: 앱 내에서 버튼을 누를 때 NullPointerException 발생) 앱을 다시 시작할 때 앱이 로드되지 않고 com.google.android.datatransport.runtime 누락으로 인해 충돌합니다.  이 버전에서 새로 추가된 ForcedSender 클래스입니다. 이것은 c

개발일기 #8 : 나의 앱에도 지문인증을 넣어보자.

원본출처: 티스토리 바로가기 바이오인증 앱을 구현하는 동안 이런 것도 생각을 해 볼 수 있었습니다.  지문인증은 어떻게 구현하는 건가? 그래서 구글에게 물어보았습니다. 어떻게 하는 거냐고...  늘 항상 답을 보여 주기는 하나 긴가 민가 하는 생각이 들 무렵 게시글 하나를 찾았고 그것을 따라 해 보기로 했습니다.    gradle 설정 // bio implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05"  module 수준의 gradle 파일에 추가된 것은 위 한 줄입니다.    Hardware 검증 이번에는 지문 인증을 사용할 수 있는 것인지 확인하는 처리를 해 봅니다.   아래 코드의 함수를 호출하게 되면,  사용이 가능한 상태 (BIOMETRIC_SUCCESS), 지문인식 센서가 없는 경우(BIOMETRIC_ERROR_NO_HARDWARE), 지문인식 센서가 이미 동작하고 있어서 준비가 되지 않은 경우(BIOMETRIC_ERROR_HW_UNAVAILABLE) 지문이 등록되지 않은 경우(BIOMETRIC_ERROR_NONE_ENROLLED)   이런 경우의 오류(또는 상태)를 만나게 됩니다.  지문 등록이 되지 않은 경우는 등록을 하도록 안내하는 페이지로 이동하도록 구성하고, 다른 경우들은 그에 맞게 알림을 주거나 인증 후 동작을 구현하게 됩니다.  여기서는 사용 가능한 상태만 저장하는 것으로 마무리를 합니다. fun checkDeviceHasBiometric() { val biometricManager = BiometricManager.from(this) when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTI

개발일기 #? 쉬어가는 페이지... Figma 와 Android Studio 의 UI 연동 이란...

원본출처: 티스토리 바로가기 https://relay.material.io/getting-started Relay Instant Handoff for Android UI. Design UI components in Figma and use them directly in Jetpack Compose projects. relay.material.io Relay 릴레이, 계전기, 교체 구글 번역기가 말해주는 번역된 단어입니다. 알게 된 것은 HOLIX라는 앱에서 jetpack compose 채팅방에 들어가 보다가 workspace 님이 올리신 글을 보고 알게 되었습니다. 찾아서 가 따라 해 보기를 해 보았습니다. 그 동안 고민했던 것들 중에 화면 구성을 어떻게 하면 그나마 쉽게 다이내믹하게 할 수 있을 까에 대한 고민을 해소할 수 있을 것 같은 생각이 듭니다. 그동안의 화면 구성은 그냥 단순하게 Object을 위치하는 것으로 대신하는 중이었습니다. 뭐 아직은 화려하거나 이쁘거나 한 화면 구성을 못해보는 것이 아쉬울 따름 이었지만, Figma라는 것이 온라인으로 화면 디자인을 할 수 있다는 것 정도만 알고 있었지 이것을 UI와 연동할 수 있다는 것을 모르고 있었으니까요. 샘플앱 이런 디자인은 간단한 것이라 그냥 그려도 되겠지만, 연동을 해서 만들어 보면 좋을 것 같다는 생각이 들었습니다. 차근 차근 배워 봐야 할 것 같아요. 이번 이야기는 10/24 에 있었던 Android Dev Summit 2022 에서 발표된 이야기 랍니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

개발일기 #6 메뉴판 구성을 위해서 TabLayout 만들어 보기

원본출처: 티스토리 바로가기 TabRow   앱을 구성하는 부분 중에서 메뉴판 같은 것을 구현하게 되는 경우가 발생합니다. 다른 방법도 있기는 하겠지만, 카테고리별로 TabRow을 구현해서 만들면 같은 종류의 상품을 배열하거나 할 때 도움이 될 것 같습니다.  그래서 오늘은 그걸 만들어 보려고 합니다.    gradle (Module) 파일에 아래 2줄을 추가해 주었습니다. // tab layout 구현 implementation "com.google.accompanist:accompanist-pager:0.20.1" implementation "com.google.accompanist:accompanist-pager-indicators:0.20.1" 이제 코드 구현을 해 보겠습니다.    val pagerState = rememberPagerState(0) 먼저 사용할 탭의 상태를 기억할 변수를 선언 합니다. 괄호 안에 숫자는 시작 시 어디에 위치하게 할 건가를 정하게 됩니다. 인덱스는 0부터 시작됩니다.   구성된 화면은 다음 그림과 같이 될 예정입니다. 구성된 화면 그래서 화면을 구성할 때 상단에 있는 Tab을 나타내는 부분과 그 아래 내용을 보여줄 부분으로 나누어서 설정을 하게 됩니다. (*맨 아래는 BottomNavigation으로 이번 글과는 무관한 구현이라 설명을 생략합니다.)   Column( modifier = Modifier.background(grayWhite) ) { Tabs(pagerState = pagerState) TabsContent(pagerState = pagerState) } 위에 Tabs는 화면 상단에 표시할 탭을 나타내며 아래 TabsContent는 아래 화면을 구성할 내용을 채워 넣을 공간입니다.   @ExperimentalPagerApi @Composable fun Tabs(pagerState

네이버 지식인 ... 지존이되다

원본출처: 티스토리 바로가기 자주 하는 것이 아니라서 오랜 시간이 걸리네요. ㅋ~ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.