IDE & Framework

    [Kotlin]Android Firebase Cloud Message(FCM) - (1) Client

    [Kotlin]Android Firebase Cloud Message(FCM) - (1) Client

    이번 포스팅에서는 FCM을 사용하기 위한 Client 구현에 대해서 포스팅 해 보겠습니다. 1. FCM이란? Firebase Cloud Message의 약자로, 다양한 플렛폼에 메세지를 전송할 수 있는 메세징 솔루션입니다. 일부 기능을 위해선 유료로 이용해야 하지만, 대부분의 경우는 무료로 해결할 수 있습니다. Firebase에서 미들서버 역활을 하는데, 메세징 솔루션까지 제공하므로 개발자들은 서버를 직접 구축할 필요 없이 매우 편리하게 메세징 서비스를 구축할 수 있다는 장점이 있습니다. 거기에 애널리틱스를 통한 분석기능까지 동시에 사용할 수 있으니, Android application 개발에선 빠질 수 없는 요소이죠. 2. FCM 적용하기 2-0. Firebase console 설정 Firebase c..

    Android Log 라이브러리 Timber

    Android Log 라이브러리 Timber

    Kotlin으로 Log를 사용하면 [ Using 'Log' instead of 'Timbe' ]라는 문구를 확인할 수 있습니다. Timber는 다음의 장점이 있습니다. 1. 태그를 별도로 입력할 필요가 없다. 2. 릴리즈때 로그를 출력하지 않는다. 3. 충돌보고 라이브러리와 통합이 쉽다 사용법 app level gradle에 의존성을 추가 repositories { mavenCentral() } dependencies { implementation 'com.jakewharton.timber:timber:5.0.1' } 초기화 Application 클래스의 omCreate()에 다음과 같이 입력합니다. *Application 클래스를 상속받는 클래스를 생성해 Manifest의 application 태그의 ..

    Android Log 라이브러리 Logger

    Android Log 라이브러리 Logger

    Logger란? Timber보다 가시성있고 이쁘게(?) 출력되는 로그 라이브러리 Logger입니다. 언제부턴가 코틀린으로 Log를 사용하다보면 Timber를 대신 쓰라고 메세지가 나와서, 다른 로깅 라이브러리가 있나 싶어 찾다 찾게 되었네요. 15년도부터 18년도까지 버전 릴리즈를 해왔고, androidx 지원을 위해 21년 2월까지 수정한 라이브러리입니다. timber보단 신뢰성이 높다고 할 순 없지만, 일단 비주얼이 굉장히 마음에 들어서 포스팅 해 봅니다. xml과 json 형식도 지원해주고 콜렉션 타입의 객체도 지원해 줘서 정말 편하기까지 합니다. 사용법도 정말 간단합니다. 사용법 의존성 추가 dependencies{ implementation 'com.orhanobut:logger:2.2.0' }..

    Android Proguard

    Android Proguard

    현재 라이브러리를 개발중에 있습니다. 공개 범위의 코드를 제외하고 소스노출의 최소화와 aar파일의 용량을 줄이기 위해서 프로가드를 사용하게 되었습니다. 적용하기위해 사용한 코드와 공부내용 포스팅 해보겠습니다. 1. Proguard란? 수행시기 - 릴리즈시 역할 1. 코드 난독화 2. 패키지 경량화 2. 사용하기 app level gradle 파일의 buildTypes태그에 다음과 같이 입력합니다. buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled true proguardFiles getDe..

    [Kotlin] PhoneStateListener deprecated, TelephonyCallback로 대체하기

    [Kotlin] PhoneStateListener deprecated, TelephonyCallback로 대체하기

    Android12로 들어서며 PhoneStateListener가 deprecated 되었습니다. 이를 TelephonyCallbck으로 대체해야 합니다. private val mPhoneStateListener = object : PhoneStateListener(){ override fun onCallStateChanged(state: Int, phoneNumber: String?) { super.onCallStateChanged(state, phoneNumber) Log.d(TAG, "onCallStateChanged is listen changed state : $state") callStateIntent = Intent(applicationContext, CallHandleService::clas..

    [Kotlin] RecyclerView (3) - ItemTouchHelper로 Swipe event 구현

    [Kotlin] RecyclerView (3) - ItemTouchHelper로 Swipe event 구현

    RecyclerView 마지막 포스팅입니다. 왼쪽에서 오른쪽으로 스와이프를 하면 통화를, 반대로 오른쪽에서 왼쪽으로 스와이프를 하면 메세지 전송이 되도록 해보겠습니다. 필요한 과정 1. item_phonebook.xml 수정 2. ItemTouchHelper.callback 구현 ㄱ. 필수 메서드 구현 ㄴ. 보조 메서드 구현 3. Adapter에 ItemTouchHelper.callback 부착 구현 1. item_phonebook.xml 수정 이제 두가지의 레이아웃이 필요합니다. 스와이프 시킬 레이아웃은 이름과 전화번호부가 적혀있는 화면이구요, 스와이프 되면 이제 양 사이드에 문자 아이콘과 전화 아이콘이 있어야겠죠? 아이템 배치는 해주었고, 이것도 리스트 아이템이니 리스트 아이템 하나하나 마다 존재해야..

    [Kotlin] RecyclerView (2) - Filter와 SerachView로 검색기능 구현

    [Kotlin] RecyclerView (2) - Filter와 SerachView로 검색기능 구현

    RecyclerView 시리즈의 두번째 포스팅입니다. 이번엔 SerachView, Filterable 위젯을 사용해 검색기능을 구현해 보겠습니다. SerachView는 커스텀하기가 쉽지 않아 EditText로 직접 구현하는 경우도 굉장히 많습니다. 하지만 공식문서를 찾아보시면 생각보다 많은 속성이 있으니, 필요에 따라 쓰시면 되겠습니다. 정리가 잘 된 블로그가 있어서 링크 공유드립니다. https://landroid.tistory.com/5 SearchView, 속성 사용법 안녕하세요! Landroid입니다~! 보통 안드로이드에서 검색 기능을 구현할 때 많이들 사용하시는데요. 의외로 자료가 많이 없어 구현하는데 애를 먹는 뷰이기도 합니다. 그래서 오늘은 SearchView 사용 landroid.tisto..

    [Kotlin] ViewPager2 사용하기

    [Kotlin] ViewPager2 사용하기

    ViewPager는 RecyclerView adpater를 사용해 상당히 쉽게 구현할 수 있습니다. 이번 포스팅은 ViewPager를 구현해 배열에 저장된 image들을 슬라이드 해보겠습니다. 필요한 재료 1. 이미지를 출력할 ViewPager 2. image를 출력할 방법을 표현한 layout 3. 배열에 저장할 image들 4. 배열의 출력을 관리할 RecyclerView 재료 구현 1. 이미지를 출력할 ViewPager 2. image를 출력할 방법을 표현한 layout 3. 배열에 저장할 image들 private fun getAespaMembers(): ArrayList { return arrayListOf( R.drawable.giselle, R.drawable.karina, R.drawabl..

    [Kotlin] RecyclerView (1) - 기본 예제

    [Kotlin] RecyclerView (1) - 기본 예제

    새 시리즈 포스팅입니다. 기본 에제 - 좌/우 스와이프로 삭제/통화 걸기 구현 - 검색 구현 - AAC MVVM적용 이렇게 총 네편으로 포스팅 할 예정입니다. RecyclerView란? ViewHolder 패턴을 사용해 아이템 뷰를 재활용하는 리스트입니다. 리스트의 아이템이 1억개가 있다고 해도, 아이템 뷰를 일정 갯수로 유지하며 값만 바꿔 보여주는 것이지요. 사용자의 입장에선 1억개가 다 세팅되어 있는것 같지만, 사실 사용하는 아이템뷰는 극히 적고, 값만 바뀌어서 재배치 되는거죠. 이를 통해 리스트의 규모가 클수록 사용자의 사용환경을 쾌적하게 만들어 주는데 굉장한 효과를 발휘합니다. 추가적으로, RecyclerView는 좌우 스와이프 및 검색을 위한 필터 등의 추가기능을 부착하기 굉장히 쉽습니다. 재료..

    Android Background Service 작업 제한

    Android Background Service 작업 제한

    0. 목차 Ⅰ. 개요 0. 서론 1. Service와 Thread의 차이 2. Service의 종류 3. Service의 제한 Ⅱ. Broadcast 제한 Ⅲ. Background 작업 제한 1. Background. 실행 제한 2. Backround에서 Activity 시작에 대한 제한 사항 Ⅰ. 개요 0. 서론 필연적으로 Background Service는 사용할 수 밖에 없습니다. 하지만, 이전과는 다르게 Android는 Background Service에는 호의적이지 않습니다. 업무와 관련되어서 자세히 찾아보게 되었고, 이를 공유하고자 정리해서 포스팅합니다. 1. Service와 Thread의 차이 Service란 Background에서 오래 실행되는 작업을 수행할 수 있는 Application ..

    [Kotlin]local properties에 변수 저장하기

    [Kotlin]local properties에 변수 저장하기

    Local properties에 변수를 왜 저장해야 하나요? 외부에 노출되면 안되는 중요한 자료들(인증받은 API Key, 메일을 보내기위한 메일계정 등)은 코드상에 하드코딩하게 되면 의도치않게 git으로 공유될 수가 있으므로, 이를 방지하기 위해 사용합니다. gitignore에는 local.propeties에 등록이 되어 있거든요. 기본으로 있다면 상관이 없지만, 만약 없다면 꼭 추가해 주세요 ㅎ Local properties에 변수를 저장하면 어떻게 되나요? Local properties에 변수를 저장하게 되면, app level gradle의 defaultConfig 태그 내에서 불러올 수 있습니다. 그렇게 되면, 프로젝트를 빌드할 때 BuildConfig 클래스에 해당 값이 추가되어 프로젝트에서 ..

    [Kotlin] Broadcast recevier란? 사용법과 예제

    [Kotlin] Broadcast recevier란? 사용법과 예제

    Broadcast recevier란? 말그대로 Broadcast를 받는 수신기라고 생각하시면 됩니다. Manifest에 수신기를 선언하거나, Context에 수신기를 구현하는 두가지 방법이 존재합니다. 안드로이드 백그라운드 정책 강화로 API 26부터 기존에 비해 수신기 구현이 어려워졌습니다. 수신대상의 패키지, 클래스명을 입력하는 명시적 브로드캐스트나, 몇가지의 암시적 브로드캐스트 예외(링크)를 제외하고는 모두 Context에 직접 수신기를 구현해야 합니다. - Manifest / Context 수신기 등록 차이 Manifest에 등록시 - 앱이 실행중이 아니여도 이벤트를 수신하고 작업을 처리할 수 있습니다. Context에 등록시 - 앱이 실행중이여야 이벤트를 수신하고 작업을 처리할 수 있습니다. 수..

    [Kotlin] Broadcast 란? 사용법과 예제

    [Kotlin] Broadcast 란? 사용법과 예제

    Broadcast란? Android Application이나 Android System에서 Publish-subscribe pattern처럼 이벤트를 송/수신 하는 컴포넌트입니다. 이벤트는 intent객체에 담겨서 발송되게 됩니다. Broadcast의 intent 뜯어보기 이벤트는 intent에 문자열로 담겨서 전송되며, 구조는 아래와 같습니다. //android.intent.action.PACKAGE_FULLY_REMOVED이벤트 broadcast의 intent Intent { act=android.intent.action.PACKAGE_FULLY_REMOVED dat=package:com.example.broadcasttestc flg=0x5000010 cmp=com.example.broadcastt..

    [Kotlin] RemoteConfig 적용하기 [간단]

    [Kotlin] RemoteConfig 적용하기 [간단]

    Remote config란, key-value쌍으로 이루어진 값을 Firebase Remote config에 등록하면, 몇줄의 간단한 코드로 app에서 가져오게 할 수 있는 기능입니다. 이를 이용해서 사용자의 업데이트 없이 앱의 동작과 뷰를 수정할수도 있고, A/B테스트를 수행하는 등, 굉장히 강력하지만, 손쉽게 사용할 수 있는 기능입니다. 해당 방법 또한 firebase에 적용하고 싶은 앱을 등록하고, application package에는 firebase project의 goole-service.json을 app수준 폴더에 위치시켜야 합니다. 해당 방법은 건너뛰겠습니다.\ 만약, 여러개의 firebase proejct를 하나의 앱에 등록하고 싶다면, firebase instance를 생성해 해당 co..

    [Kotlin] Firebase Crashlytics 적용시키기 (간단!)

    [Kotlin] Firebase Crashlytics 적용시키기 (간단!)

    Firebase Crashlytics는 전신이 Fabric Crashlytics이며, 실시간 비정상 종료 보고 도구입니다. 이를 처리하기 쉽게 목록으로 종합해 정보를 제공하고, 비정상 종료의 심각도와 발생률또한 보여줍니다. 최대의 장점은 부착하기 쉽고, 제어가 간편하다는 점입니다. ANR이나 crash로 인해 앱이 종료된 후, 다시 실행시켰을 때 fb crashlytics로 해당 에러를 전송해줍니다. 주의점은, Firebase의 여타 컴포넌트들과 달리, FirebaseApp으로 Instance생성이 불가능하다는 점입니다. https://firebase.google.com/docs/crashlytics Firebase Crashlytics | Firebase Documentation Apple, Andro..

    [Kotlin] Firebase Crashlytics 적용시키기 (간단!)

    [Kotlin] Firebase Crashlytics 적용시키기 (간단!)

    Firebase Crashlytics는 전신이 Fabric Crashlytics이며, 실시간 비정상 종료 보고 도구입니다. 이를 처리하기 쉽게 목록으로 종합해 정보를 제공하고, 비정상 종료의 심각도와 발생률또한 보여줍니다. 최대의 장점은 부착하기 쉽고, 제어가 간편하다는 점입니다. ANR이나 crash로 인해 앱이 종료된 후, 다시 실행시켰을 때 fb crashlytics로 해당 에러를 전송해줍니다. 주의점은, Firebase의 여타 컴포넌트들과 달리, FirebaseApp으로 Instance생성이 불가능하다는 점입니다. https://firebase.google.com/docs/crashlytics Firebase Crashlytics | Firebase Documentation Apple, Andro..

    [JAVA] Base64 incoding, decoding

    Base64는 Java.Base4와 android.Base64 두 종류가 존재한다. Java.Base64는 api 26(Oreo)부터 사용가능하고, android.Base64는 api 제한이 없다. 1. Java.Base64 incoding-decoding @RequiresApi(api = Build.VERSION_CODES.O) public String stringToBase64(String target){ Base64.getEncoder().encodeToString(originalInput.getBytes()); } @RequiresApi(api = Build.VERSION_CODES.O) public String Base64ToString(String encodedString){ return ne..

    [Kotlin] InCallService로 Default Dialer 개발하기

    [Kotlin] InCallService로 Default Dialer 개발하기

    1. ConnectionService와 InCallService의 차이 InCallService 대부분의 스펙은 구현이 되어있으며, 구현된 항목을 선언하고 요청만 해주면 구현할 수 있다. ConnectionService는 VOIP개발에 더 적합하다. gsm통화를 개발하기 위해 각종 편의사항이 제공되는 InCallService와는 다르게, 연결을 직접 받아 등록하고 통화의 시작, 종료까지 모두 구현해주어야 한다. 그래서 VOIP구현엔 오픈소스 라이브러리를 주로 사용한다 (kakao talk도 보이스톡도 그렇다!) 2. InCallService 사용을 위한 사전 준비 기본 통화앱이 되도록 Manifest 및 userpermission 수정 ㄱ. Manifest - ues permission tags //OU..

    [Kotlin]ActivityForResult 및 checkSelfPerission 을 permissionLauncher로 대체하기

    [Kotlin]ActivityForResult 및 checkSelfPerission 을 permissionLauncher로 대체하기

    자주 사용하기 때문에 검색안하고 긁어 쓰려고 포스팅 합니다...! 순서 1. 설정창 여는 퍼미션 2. 설정창 필요없이 팝업으로 획득하는 퍼미션 1. 설정창을 열어야 하는 system alert window의 경우 var ovelayPermission = Settings.canDrawOverlays(this) val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName")) val activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { ovelayPermission = Setting..

    [Kotlin] Fragment (2) - 기초 예제

    [Kotlin] Fragment (2) - 기초 예제

    * 본 예제는 간단히 ViewBinding을 사용합니다 https://greensky0026.tistory.com/190 View binding 사용해보기 findbyviewid를 쓰지 않아도 되게 해줘서 코드가 매우 간결해집니다. app level gradle //build.gradle android{ //... viewBinding { enabled = true } } //... } replace Acitivity - onCreate : setContentView.. greensky0026.tistory.com 개요 본 예저는 간단히 fragment를 버튼을 클릭해 swap해 보여주는 Application 입니다. MainActivity는 main, another 버튼이 존재하며 클릭시 해당 frag..