Android/Android

    [Android] 외부저장소에 파일 저장하기

    [Android] 외부저장소에 파일 저장하기

    안드로이드 파일 시스템에는 크게 내부저장소, 외부저장소가 존재한다. 앱 디버깅이나 기타 다른 목적을 위해 앱 경로에 파일을 저장하곤 했는데 이것이 내부저장소이다. 디바이스 파일 탐색기에서 찾을 수 없고 특별히 권한을 요청하지 않아도 된다. 그러나 나의 경우에는 디바이스 파일 탐색기에 저장되고, 불러오기를 원했다. 내부저장소에 저장할 경우 앱 재설치하는 경우 데이터가 다 날아가버리기 때문이다. 따라서, 외부저장소는 다른 곳에서도 접근이 가능한 곳을 의미한다. 파일 탐색기를 열어보면 나오는 파일들...이라고 하면 이해가 편할까 외부저장소의 경우 WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE 권한을 부여 받아야 한다. 파일 저장하기 디바이스 파일 - 문서 경로에 파일을 저장..

    [Android] Android FCM 설정

    [Android] Android FCM 설정

    Firebase Cloud Messaging 메시지를 안정적으로 무료 전송할 수 있는 크로스 플랫폼 메시징 솔루션 기본 원리 Firebase용 Cloud Functions 또는 앱 서버와 같이 메시지를 작성, 타겟팅, 전송할 수 있는 신뢰할 수 있는 환경 메시지 요청을 수락하는 등 여러 기능을 수행하는 FCM 백엔드는 주제를 통해 메시지 팬아웃을 수행하고 메시지 ID와 같은 메시지 메타데이터를 생성 기기로 타겟팅된 메시지를 라우팅하고, 메시지 전송을 처리하고, 필요한 경우 플랫폼별 구성을 적용 알림이 표시되거나 앱의 포그라운드/백그라운드 상태 및 관련 애플리케이션 로직에 따라 메시지가 처리 수명 주기 흐름 FCM에서 메시지를 수신하도록 기기 등록 클라이언트 앱의 인스턴스가 메시지를 수신하도록 등록하여 앱..

    [Android] Jetpack Compose 프로젝트 생성 + MainActivity 살펴보기

    [Android] Jetpack Compose 프로젝트 생성 + MainActivity 살펴보기

    기존 프로젝트와의 차이 build.gradle (:app) android { ... buildFeatures { compose true } } 폴더 구조 앱을 만들기 위한 리소스 (컬러, 테마 등) 가 res/values 가 아니라 패키지/ui 에 존재한다. 리소스에 접근하기 위해 xml에 접근하는 것이 아니라 kotlin 코드로 리소스를 생성하고, 접근할 수 있음을 의미한다. MainActivity xml 방식 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_m..

    [Android] Thread와 Coroutine

    [Android] Thread와 Coroutine

    val list = mutableListOf("포도", "메론", "딸기", "사과", "바나나") CoroutineScope(Dispatchers.Main).launch { list.forEach { item -> if (item == "딸기") { list.remove(item) Log.d(TAG, "1. ${list}") } } } CoroutineScope(Dispatchers.IO).launch { list.forEach { item -> if (item == "바나나") { list.remove(item) list.add("자두") Log.d(TAG, "2. ${list}") } } } /* 2023-04-03 21:19:20.540 2. [포도, 메론, 딸기, 사과, 자두] 2023-04-0..

    [Android] 커스텀뷰 만들기

    [Android] 커스텀뷰 만들기

    커스텀뷰 xml (view)에서의 모듈화는 CustomView로 해결이 가능하다. 이렇게 생긴 버튼이 있다. 이런 화면을 만들어야 한다고 할때, 저 버튼 네개를 복붙해서 만들면 되겠지? 라고 생각할 수 있다. 그렇지만 만약 어떤 수정사항이 생긴다면? 네번 수정을 해주어야 한다. 그러다 보면 그 과정에서 생기는 오류나 실수는 아주 자연스러운 수순이 된다. (경험담 이를 방지하고자 style을 사용했지만..좀 더 쌈빡한 방법은 없을까? 라고 생각이 되어질 때 쯤에서야 CustomView를 알게 되었다…….늦었다고 생각할 때가 가장 빠른 법 얼른 알아보자. 만들기 1. xml 작업하기 생성할 커스텀 뷰의 xml 작업을 먼저 진행해준다. 나의 경우 앞에 아이콘이 붙은 버튼을 하나 만들었다. 이제 여기서 아이콘과..

    [Android] Jetpack Compose? true!

    [Android] Jetpack Compose? true!

    컴포즈를 향한 나의 끝없는 구애(?)는 작년부터 계속 되었다. 비록 실무에서는 아직 적용해볼 기회가 없었지만... 틈날때마다 씹고 뜯고 맛보려고 노력했다는 얘기다. 그 흔적들을 하나씩 기록해보려고 하는데, 첫번째는 지난해 진행했던 집단지성의 방의 첫번째 컨퍼런스인 '집단지성의 날' 에서 발표했던 Jetpack Compose 의 자료이다. 집단지성의 날에 관한 건 아래를 참고하면 된다. 집단지성의 방 : 컨퍼런스 개최한 후기 안녕하세요. 핀수입니다. (이런 인사 해보고 싶었어요.) 오늘은 지난 9월 1일 개최된 컨퍼런스인 집단지성의 날의 후기를 들고 왔습니다. 처음 듣는 컨퍼런스라고요? 당연함. 저희가 만들었음 그 www.pinslog.com 그리고 첫번째로 Jetpack Compose를 살펴보았던 겉핥기..

    [Android] Room 살펴보기

    [Android] Room 살펴보기

    이번에 (나름) 해커톤을 진행하면서 만들었던 서비스에 적용하기 위해 Room을 공부하는 시간을 가졌었다. 이를 기록해보려고 한다! Room SQLite에 추상화 계층을 제공하여 SQLite를 완벽히 활용하면서 더 견고한 데이터베이스 액세스를 가능하게 한다. 기존 안드로이드 로컬데이터베이스인 SQLite..에서 좀 더 개선된 라이브러리라고 생각이 되는데 SQLite를 사용할 때보다 Room을 사용했을 때의 이점은 무엇이 있을까? 왜 더 개선된 것이 나왔을까? Room을 사용하면 좋은 점 SQLite API를 직접 사용하는 것보다 여러 가지 이점이 있다고 한다. SQL 쿼리의 컴파일 시간 확인 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 편의 주석 간소화된 데이터베이스 이전 경로 Room의 구성..

    [Android] DataBinding 적용하기 - 03

    [Android] DataBinding 적용하기 - 03

    지난 글에서는 개인 프로젝트인 WW에 DataBinding을 적용하며 알게 된 것들을 기술해보았다. 이번 글에서는 RecyclerView에 DataBinding을 적용하는 방법에 대해 알아볼 것이다. RecyclerView에 DataBinding 적용하기 데이터바인딩도 좋고 다 좋지만 아이템 갯수가 0개이면 onCreateViewHolder 호출 안되는거 명심하고....(to me from me...) 데이터가 변경 됐으면 됐다고 알려주는 거 잊지 말자고...^^ 이번 글에서 적용해줄 레이아웃 친구를 소개한다(?) 1. BindingAdapter 만들기 @SuppressLint("NotifyDataSetChanged") @BindingAdapter("app:items") fun setForecastLis..

    [Android] DataBinding 적용하기 - 02

    [Android] DataBinding 적용하기 - 02

    지난 글에서는 DataBinding이 무엇인지, 어떻게 적용하는 지에 대해 알아보았다. 이번에는 실제 개인 프로젝트에 적용하며 알게된 것을 작성해보려고 한다. 기온별 옷차림 안내 어플인 'WW'에 데이터 바인딩을 적용해보기로 했다. WW에는 기능이 별로 많지 않아서, 화면도 별로 없다. WW의 화면은 다음과 같다. (이게 다다 ㅎ) 상단에는 현재 날씨가 하단에는 5일간의 예보가 자리를 차지하고 있다. 상단에는 현재 온도, 현재 시간, 옷 차림 정보, 날씨 아이콘 ID, 날씨 설명 데이터가 필요하다. 이전 글에서 설명했던 대로 필요한 데이터를 바인딩 해줄 수 있었다. setImageResoucre 그런데 이미지는? android:src="@{weatherViewModel.getValue.weatherIco..

    [Android] DataBinding 적용하기 - 01

    [Android] DataBinding 적용하기 - 01

    DataBinding 프로그래매틱 방식이 아니라 선언적 형식으로 레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있는 지원 라이브러리 안드로이드 개발자라면 많이들 알고 있는 데이터바인딩! 현재 개발하고 있는 WW는, 기존에는 ViewBinding을 통해서 UI를 업데이트하고 있었는데 이후 나머지 기능들을 개발하면서 DataBinding도 같이 써보면 좋겠다고 생각해 적용을 해보았다. 알다시피 기존의 UI 업데이트 방식은 findViewById 를 통해 view를 찾고, 거기에 맞는 데이터를 업데이트 하는 방식이었다. findViewById(R.id.sample_text).apply { text = viewModel.userName } 내가 기존에 사용했던 ViewBinding은 findViewB..

    [Android] BLE 통신 구현하기

    [Android] BLE 통신 구현하기

    BLE 다들 알고 있겠지만 우리가 아는 블루투스와 BLE는 약간 다르다. 블루투스 통신 프로토콜이라는 큰 카테고리안에 들어가긴 하지만 안드로이드에서 통신하기 위한 코드와 로직이 다르다는 의미다. BLE는 블루투스 4.0에서부터 채택되었으며, 기존 블루투스 기술보다 전력을 적게 소모한다. 사용하기 기존 블루투스와 거의 비슷하다. 다만 기존 블루투스에서 자주 보던 '페어링' 하는 과정이 빠져있으며, 유의해야할 점은 BLE 장치를 블루투스 설정창에서 검색하고 연결하려고 하면 버전 9이하 버전에서는 연결을 거부한다는 메세지를 볼 수 있고, 그 위로는 그냥 페어링이 되지 않는다. 1. 권한 선언 위에서 말했듯 같은 블루투스 프로토콜이기 때문에 권한 선언은 기존 블루투스를 사용하기 위해 선언해야하는 권한과 같다. ..

    [Android] Unity 연동된 Android 프로젝트에서 Unity만 종료하기

    [Android] Unity 연동된 Android 프로젝트에서 Unity만 종료하기

    안드로이드에 있는 유니티 프로젝트만을 종료하고 싶을 때 유니티 쪽에서 Application.Quit() 를 호출하면 유니티 프로세스만 종료할 수 있다고 해서 해봤는데 앱이 죽어버린다. (그러나 죽기 전의 액티비티부터 재실행 되는 걸로 보인다.) 이것의 해답은 AndroidManifest.xml에서 해당 액티비티에 process 속성을 부여하는 것이다. 그런데 두가지 문제가 있다. Unity에서 Application.Quit()가 실행되지 않는다는 것 그래서 일단 mUnityPlayer.quit() 를 실행했다. Android에서 Unity 메서드 호출하는 법 (Unity script에 해당 오브젝트와 메소드가 있어야겠죠) UnityPlayer.UnitySendMessage("Unity Object", "..