목록Dev/Android (10)
에르노트
앱에 광고를 게제해서 수익을 창출하기 위해 페이스북 오디언스 네트워크(Facebook Audience Network)를 사용해왔다. 그러던 중 오디언스 네트워크 SDK의 버전이 오래되었으니 최신 버전으로 업데이트하라는 알림을 받았고, 무심코 앱 단위 build.gradle에서 버전을 높여주었다. (5.5 -> 5.10.0) 그랬더니 다음과 같은 문제가 발생하기 시작했다.. 해당 문제는 기존에 안드로이드9에서 발생하던 ERR_CLEARTEXT_NOT_PERMITTED 에러와 연결되어 있다. 그래서 페이스북에서도 이 해결법대로 자체적인 해결 가이드(네트워크 보안 구성)를 따로 마련해두었다. 즉 그대로 따라하기만해도 손쉽게 해결할 수 있다는 것이다. 여기서 핵심은 오디언스 네트워크가 localhost를 캐싱에..
일반적인 속도로 화면을 끌어내릴 때는 거의 그 속도에 맞춰서 onBindViewHolder()가 호출되고, 사용자는 위화감을 느끼지 않는다. 그런데 위 예시처럼 급격하게 스크롤을 꺽어올려버리면 아이템이 다시 바인딩되는 과정에서 다소 딜레이가 발생할 수 있다. 위 경우는 미리 구성된 데이터를 바인딩하는 것이 아니라 api 콜을 통해 비동기적으로 선수 이름을 불러와서 바인딩하는 경우였으므로 그 딜레이를 사용자가 눈으로 느낄 수 있기에 문제가 되었다. 여러가지 시도를 해보았는데 결국 해결법은 매우 간단했다. 아이템의 개수가 정해진 경우라면 그 개수만큼, 혹은 스크롤이 지나갈 충분한 양만큼을 캐시해두면 된다. 그리고 안드로이드 리사이클러뷰에서는 자체적으로 그 메소드를 제공하고 있다. RecyclerView.se..
안드로이드 앱을 사용하다보면 서로 다른 앱 간 데이터를 공유해야 할 일이 종종 생긴다. 메모 앱의 텍스트 내용을 카톡으로 넘겨주거나 반대로 카카오톡 메세지 내용을 메모장에 공유해서 저장시키는 것이 대표적인 예시라고 볼 수 있다. 그래서 안드로이드에서는 미리 Intent.ACTION_SEND 라는 공유 인텐트를 만들어 두었다. 이를 통해 다른 앱으로 간단한 데이터 보내기를 쉽게 구현할 수 있다. 한편 다른 앱이 보낸 간단한 데이터를 받을 앱 목록에 내 앱을 추가하고 싶을 수도 있다. 이때는 manifest에다가 Activity 태그 아래에 intent-filter를 추가해주는 방법으로 역시 손쉽게 처리가 가능하다. 공식 문서는 여기 참조. 여기서 mimeType은 전달받을 데이터 타입이라고 보면 된다. 표..
안드로이드 초창기(킷캣 이전)에 카메라 프리뷰를 다루는 예제는 매우 간단했다. 그런데 5.0롤리팝에 오면서 기존 android.hardware.camera가 Deprecated 되버리고 새롭게 더 복잡한 camera2로 대체되었다. 더불어 6.0마시멜로에 와서는 권한 체크가 강화되면서 더 신경쓸 일이 많아져서 이전과는 완전히 새로운 코드가 필요하게 되었다. 그래서 최신 트렌드에 맞추어 camera2 예제를 코틀린으로 리팩토링 해보았다. 우선 카메라2 공식문서는 여기를 확인하면 된다. 그리고 본 예제는 이 블로그의 예제를 기반으로 작성되었다. 카메라에 보이는 것들은 SurfaceView를 통해 표현된다. 일반 뷰의 경우 뷰를 그리는 일은 메인 스레드에서 담당한다. 그러나 카메라가 표현하는 프리뷰는 실시간으..
구글 JetPack component에 포함되어 안드로이드 로컬 데이터베이스 접근을 도와주는 Room 라이브러리를 공부하던 중 'Entity class must be annotated with @Entity'라는 에러를 겪었다. 다행히 별 복잡한 문제는 아니었고 에러문구 자체가 해결법인 간단한 문제였다. 전에 사용해 본 또 다른 모바일 로컬 DB인 Realm에서는 RealmObject을 상속받는 형태로 Entity를 정의했었다. 그런데 Room Database에서는 일반적인 자바 클래스 혹은 코틀린의 데이터 클래스를 그대로 사용한다. 따라서 내가 작성한 클래스가 DB의 엔티티로 쓰일 것임을 명시해줘야하고, @Entity 어노테이션이 바로 그 표식인 것이다. 실제 예시는 아래와 같다. @Entity dat..
코틀린 안드로이드 확장 라이브러리로 유명했던 Anko가 2019년 12월부로 Deprecated 되었다. Anko가 처음 등장할 때에 반해 이제 다른 좋은 대안들이 생겼으며, 더불어 안드로이드 자체의 최적화도 많이 진행되었다고 한다. 따라서 더 이상 Anko를 지속해서 개발할 이유가 없기에 이와 같은 결정이 내려진 것 같다. 그럼에도 불구하고 Anko는 글을 쓰는 현 시점에서 굉장히 훌륭한 라이브러리이며 기존의 프로젝트를 갈아엎을 이유는 전혀 없다고 본다. 다만 유지보수와 신규 버전 대응을 고려하면 이제 앞으로 새롭게 개발할 프로젝트에서 Deprecated된 라이브러리를 채용하기는 영 찝찝한 감이 있다. 다행히 Anko는 떠나는 와중에 그 대안들을 명확하게 제시했고, 그 중 하나가 Splitties이다...
약 3년 전에 출시했다가 내렸던 Chest Memo를 플레이스토어 다시 올렸다. 그리고 채 몇시간이 지나지 않아 '누르자마자 튕겨요'라는 대답이 돌아왔다.. 즉각 여러 기기에서 테스트를 거듭한 끝에 결국 문제는 안드로이드 8.0 오레오 버전에서만 터진다는 사실을 알아차릴 수 있었다. 앱을 처음 출시했던 2016년도의 안드로이드 최신 버전은 안드로이드7 누가였고, 그마저도 이제 막 나온 따끈따끈한 버전이었다(2016년 8월 22일에 Android7.0 Nougat이 처음 출시됐다). 다시 말해 그 당시만해도 오레오 버전은 아예 존재하지도 않았다... 그러나 3년이 지난 지금에서 안드로이드8(Oreo) 버전을 지원하는 것은 너무도 당연하고, 오레오 버전의 시장점유율은 정말로 무시할 것이 못 된다. 사용자로부..
Unable to start activity ComponentInfo{}: java.lang.RuntimeException: A TaskDescription's primary color should be opaque 필자가 현재 사용중인 안드로이드9.0 Pie에서는 아무 문제가 없었다. 그래서 아무런 의심없이 바로 출시해버렸다. 그런데 웬걸.. 혹시나하고 녹스 에뮬레이터로 앱을 다운받아보니 실행조차 되지 않았다.. 급하게 안드로이드 스튜디오를 키고 로그캣을 뒤적거린뒤 스택오버플로우에서 어렵지않게 답을 찾을 수 있었다. 사실 로그캣에 답이 고스란히 적혀있는데, primary color는 opaque(불투명)해야만 한다. 아마도 얼마전 업데이트했던 최신 안드로이드 스튜디오의 컬러피커 기능이 자동으로 alph..
안드로이드 스튜디오(Android Studio)와 깃허브(Github) 연동하기[1/2] 우선 테스트를 위해 새로운 프로젝트를 생성했습니다. 프로젝트 이름은 블로그 이름인 Makasti입니다ㅎㅎ액티비티도 비워두는 가장 간단한 형태의 프로젝트를 하나 만들었습니다. 그대로 VCS 탭으로 들어갑니다. VCS란 Version Control System의 약자로서 버전 관리 시스템입니다. 굳이 Github가 아니더라도 서브버전이나 구글 클라우드 등도 이용할 수 있습니다. 하지만 앞서 살펴본대로 가장 널리 쓰이고 또 다양한 기능을 지원하는 Guthub이기에 이걸 쓰지 않을 이유도 없습니다. 따라서 Share Project on GitHub를 클릭해줍니다ㅎㅎ 이니셜 커밋에 프로젝트를 추가할 수 있는 창이 나옵니다. ..
GitHub란 무엇인가? 우선 git이란 리눅스 운영체제를 개발한 리누스 토르발스 가 개발한 분산형 버전 관리 프로그램. 입니다. GitHub는 이 Git 저장소의 대표격입니다. 깃허브에 자신의 프로그램 소스를 무료로 업로드하여 보관할 수 있습니다. 단 이때 무료로 올린 소스는 반드시 오픈소스로 공개해야합니다. 따라서 오픈소스 저장소 정도로 봐도 무방합니다. 물론 유료 기능에서는 소스를 비공개 할 수도 있습니다. 이 깃허브에 올라온 오픈소스는 압축파일의 형태로 다운로드 받을 수도 있고 SVN으로 다운받을 수도 있습니다. GitHub 계정이 있다면 자신의 계정으로 원하는 소스를 '포크'하여 그대로 가져올 수도 있습니다. 깃의 가장 큰 장점으로는 소스코드 백업의 의미를 가져서 혹시나 힘들게 작업한 코드를 날..