안드로이드

    다국어 지원 (Wear OS)

    다국어 지원 (Wear OS)

    WearOS 용 Compose에서 Watch 단독사용을 가정한 설명입니다. 단순 언어 변경은 휴대폰과 페어링 돼있으면 6번은 할 필요 없이 안드로이드 디벨로퍼 사이트 단계를 따라 하시면 됩니다. 회사 프로젝트 중 워치에서 단독으로 다국어 지원할 경우가 생겨 구현해 봤습니다. 일반적인 워치앱은 휴대폰과 언어 설정이 동기화되어 코드로 강제전환 시킬 필요가 없지만 워치 단독 사용을 가정한 앱이라 넣었습니다. 과정 string.xml 정의 = Build.VERSION_CODES.TIRAMISU) { localeManager.applicationLocales = LocaleList.forLanguageTags("ko") } else{ LocaleListCompat.forLanguageTags("ko") } }) ..

    FusedLocationService로 위치 조회

    FusedLocationService로 위치 조회

    위치 인식 앱 빌드 | Android 개발자 | Android Developers 위치 인식 앱 빌드 모바일 애플리케이션의 고유한 기능 중 하나는 위치 인식 기능입니다. 모바일 사용자는 어디에나 기기를 휴대하기 때문에 앱에 위치 인식 기능을 추가하면 사용자에게 더욱 developer.android.com 안드로이드 공식문서에서 제공하는 위치 라이브러리입니다. 기존에 사용하던 LocationManager는 생각보다 정확하지 않아서 새로운 위치기반 API로 바꾸면서 정리해보려 합니다. 총 4단계로 의존성 주입 권한 설정 및 권한 검증 위치 기능 구현 사용 입니다. 의존성 주입 구글 위치 설정 라이브러리 의존성을 app 단 build.gradle에 넣어줍니다. //구글 위치 설정 라이브러리 implementa..

    SingleTon Holder로 편하게 SingleTon 쓰기

    SingleTon Holder로 편하게 SingleTon 쓰기

    class MyViewModel(){ companion object: SingleTonHolder } Compose에서 ViewModel로 데이터 전달을 하다 보니 항상 같은 인스턴스를 사용할 필요가 생겼습니다. 코드 1. 싱글톤으로 호출할 클래스의 생성자가 없는 경우 open class SingletonHolder (creator: () -> A) { private var creator: (() -> A)? = creator @Volatile private var instance: A? = null fun getInstance(): A{ val checkInstance = instance if(checkInstance != null) return checkInstance return synchroniz..

    ApplicationContext 일반 클래스에서 쓰기

    ApplicationContext 일반 클래스에서 쓰기

    개발하면서 Service가 아닌 Repository와 같이 사용자가 임의로 만든 클래스에서 Context가 필요한 경우가 있다. 일반적으로 패러미터로 넘기거나 클래스 생성자로 넘기는 방법이 있습니다. (생성자로 넘기게 되면 의존성이 강해지므로 권장하는 방법은 아니다. ) Context를 매번 넘길 필요 없이 어디에서든 ApplicationContext를 받는 방법이 있습니다. 만약 Context가 무엇인지 이해하지 못하고 있다면 아래글을 보는걸 추천드립니다. Context? 개발하면서 항상 헷깔렸던 Context에 대해 공식문서와 구글 검색을 통해 정리를 해봤다. 정의 문맥 또는 맥락은 언어학, 사회학에서 핵심이 되는 사건 주변의 실체 정의만 봤을 때 안드로이드에서 huzit.tistory.com 방법..

    IllegalStateException:no event down from INITIALIZED in component androidx.navigation.NavBackStackEntry

    IllegalStateException:no event down from INITIALIZED in component androidx.navigation.NavBackStackEntry

    원인 Android Composed에서 Navigation이 일어났을 때 발생했습니다. 문제의 코드 navigateToQrMainPage = { navController.navigate("main_page"){ launchSingleTop = true restoreState = false popUpTo(navController.graph.startDestinationId){ saveState = true inclusive = true } } } 해결 From the androiddev community on Reddit Explore this post and more from the androiddev community www.reddit.com 레딧 이슈를 확인해 본 결과 Lifecycle 문제임을 찾..

    Unable to add window -- token null is not valid; is your activity running?

    Unable to add window -- token null is not valid; is your activity running?

    원인 Dialog에 context를 넘겨 줄 때 ApplicationContext를 넘겨주면 발생하는 에러 val dialog = BasicDialog(applicationContext) .setTitle("KeepMe에 업데이트가 필요합니다") .setMessage("이 앱을 사용하려면 최신 버전을 다운로드하세요.") .setPositiveButton("업데이트") { startActivity( Intent( Intent.ACTION_VIEW, Uri.parse(appUpdateURL) ) ) } 해결 현재 액티비티의 context를 넣어주거나 fragment일 경우 requireContext()로 context를 가져와 넘겨주면 된다 val dialog = BasicDialog(this) .setTi..

    NetworkOnMainThreadException

    NetworkOnMainThreadException

    원인 안드로이드에서 네트워크 작업은 메인 스레드가 아닌 작업스레드에서 해야함 해결 kotlin이면 CoroutinScope(Dispacher.Default).launch{} 로 감싸면 해결 자바면 쓰레드 하나 만들어주면 된다.