IDE & Framework/Android

    [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..

    [Kotlin] Fragment (1) - Introduce

    [Kotlin] Fragment (1) - Introduce

    이번 포스팅 시리즈는 Fragment입니다. 쓸줄 아는것괘 왜 쓰는지 안는것은 천지차이라고들 하는데, 저는 쓸줄만 알았던거 같아 공부한것을 정리겸 포스팅을 작성해보게 되었습니다. Fragment (1) - Introduce 1. Fragment vs Activity 저는 Fragement에 대해 장황하게 설명하기보단, 비슷한 역할을 수행하는 Activity와의 비교가 더 이해해 도움이 되었기에, 서두로 간략히 서술해 보도록 하겠습니다. ㄱ. 독립성 Activity는 사용자와 앱이 상호작용 하는 진입점이여서 Application의 필수 요소이다. Fragment는 화면의 일부 또는 전체를 구성하는 객체이다. 그렇기에 Fragment는 스스로 독립적으로 존재할 수 없고 필수요소는 아니다. ㄴ. 퍼포먼스 Ac..

    [Kotlin] WorkManager 사용해보기

    [Kotlin] WorkManager 사용해보기

    서론 우선, 워크매니저를 사용하기 전, 구성요소에 대해 알아보자. 워크매니저의 구성요소는 크게 네가지이다. WorkManager 처리할 작업들을 큐에 저장해 관리한다. 여러 인스턴스가 호출되면 곤란해지기 때문에, 싱글톤 패턴으로 구현되어 있으며, getInstance() 메서드를 사용해 인스턴스를 받아 사용한다. Worker 추상클래스이며, doWork()메서드를 오버라이드해서 해야할 작업을 작성한다. 완료시 SUCCESS, FALURE, RETRY중 하나를 반환해야 한다. 반환한 결과에 따라 WorkManager의 이후 동작이 결정하게 된다. WorkRequest Worker의 doWork를 어떻게 작업할 것인지 제약사항, 실행조건, 반복여부 등의 조건을 설정한다. 반복작업과 한번만 수행할 작업으로 나..

    [Kotiln] 실행아이콘이 없는, 런처가 없는 앱 만들기

    [Kotiln] 실행아이콘이 없는, 런처가 없는 앱 만들기

    시프트+시프트로 action search창으로 Edit Configurations 설정에 들어간다. 그리고 위와같이 설정하면, 런처가 없어도 실행가능. 실행시킬 앱의 Intent-filter action명 변경 실행부 변경 intent = Intent() intent.setPackage("com.example.fcmautopopup") intent.setAction("com.example.fcmautopopup") startActivity(intent) 하지만, 기존 실행한 앱은 사라지고 새 앱이 실행되었음. flag추가해 별도의 task로 실행하도록 수정 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) [고려할 사항] 권한을 획득하고 자연스러운 종료 → 권환획득 실패..

    [Kotlin] ContentResolver 기본 : 통화내역(Call log) 조회

    [Kotlin] ContentResolver 기본 : 통화내역(Call log) 조회

    1ContentResolver란? ContentProvider가 uri로 접근경로를 열어 제공하는 데이터들을 조회하는 Query입니다.쉽게 생각해서 content uri에 db가 존재하고, 그걸 조회하는 qeury를 작성해 contentResolver로 실행한다고 볼 수 있습니다. val resolver: ContentResolver = this.contentResolver val callLogUri = CallLog.Calls.CONTENT_URI var cursor: Cursor? try{ cursor = resolver.query(callLogUri, null, null, null, null) if (cursor != null) { var maxcount = 2 while (cursor.moveTo..

    AAC MVVM - (3)AAC ViewModel + ViewBinding

    AAC MVVM - (3)AAC ViewModel + ViewBinding

    역할 : View에 필요한 데이터를 담당하고, 비즈니스 로직을 담당해 데이터를 처리한다. 즉, View와 Model 사이에 위치한다고 볼 수 있다. 애초에 나온 이유는 view와 model간의 결합도를 낮추기 위함으로, ViewModel이 View를 참조하면 의미가 없어진다, 따라서, ViewModel은 View를 참조하면 않된다. 또한, view는 model이 아닌 viewmodel을 통해서만 data에 접근가능해야 한다. AAC ViewModel을 사용했을 때, MVVM 구현에 어떤 이득이? 수명주기를 고려할 수 있기 때문, class ChronometerViewModel : ViewModel(){ private var startTime: Long = 0 fun getStartTime(): Long ..

    AAC MVVM - (2)Data binding

    AAC MVVM - (2)Data binding

    앱단위 gradle 설정 //build.gradle android{ //... dataBinding{ enabled = true } } //... } databinding을 사용할 xml을 layout으로 감싸고 data태그 추가 //xml

    AAC MVVM - (1)Live Data

    AAC MVVM - (1)Live Data

    Activity = LifecycleOwner Activity는 내부에 Lifecycle을 갖고 있다. LiveData는 Data의 변경을 관찰할 수 있는 data holder 클래스이다. 일반적인 observable과는 다르게 생명주기를 인식하고 활성상태일때 업데이트 합니다. (active : started or resumed) Live data의 데이터가 변화하면, 등록된 observer객체에 변화를 알려주고 observer의 onChanged()메소드를 실행하게 된다. LifecycleOwner에 액티비티 또는 프래그먼트를 입력해 해당 생명주기를 따르게 된다. 장점 LifeCycle을 따르므로 따로 핸들링 안해도 UI와 DATA가 동기화를 알아서 해줌 생명주기 객체와 결합되어 메모리 누수가 없음 스..

    View binding 사용해보기

    View binding 사용해보기

    findbyviewid를 쓰지 않아도 되게 해줘서 코드가 매우 간결해집니다. app level gradle //build.gradle android{ //... viewBinding { enabled = true } } //... } replace Acitivity - onCreate : setContentView ActivityCallBinding binding = ActivityCallBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.layour_resource_id //바로접근가능 위의 gradle을 설정하고 sync해주면 activity이름에 맞춰 binding된 객체가 준비됩니다. activity_ca..

    [Kotlin] retrofit2 간단한 사용법

    [Kotlin] retrofit2 간단한 사용법

    app단위 build.gradle에 추가 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' 인터넷 사용 퍼미션 허용(https) http에 접근하려면 추가로 설정을 해주어야 합니다! DTO data class Contract( @SerializedName("pName") var name: String, @SerializedName("pPhoneNumber") var phoneNumber: String, @SerializedName("pImagePath") var imagePath: String, @SerializedName("pEmail") var ..

    [Android] SHA-1 쉽게 찾는법

    [Android] SHA-1 쉽게 찾는법

    Firebase엔 sha-1키를 요구하는데요, 다른 방법들도 많지만 가장 쉽게 찾는방법을 공유해드립니다. control을 두번 입력해주시고요 gradle signingRepor를 입력하고 엔터를 입력해주시면 아래와같이 필요한 정보가 다 출력되게 됩니다. path찾아서 확인하거나 cli tool을 설치해서 찾는방법은 너무 번거롭고, 방법도 자주 바뀌다보니.. 전 이렇게 찾아서 쓰고 있습니다..ㅎㅎ; 그럼 이만!

    Android에서 SQLite 사용하기 (feat.ROOM)

    Android에서 SQLite 사용하기 (feat.ROOM)

    Android 공식 개발자 홈페이지에서도 SQLite대신 ROOM을 사용하는것을 적극 권장하고 있습니다. ROOM을 적극권장하는 내용은 아래와 같습니다 SQLite는 쿼리에 대한 에러를 컴파일시 확인할 수 없다. (ROOM은 확인 가능) SQLite는 스키마가 변경되면 수동으로 SQL쿼리를 업데이트 해야한다. (ROOM은 자동으로 해줌) SQLite는 java 데이터 객체를 변경하려면 많은 boilerplate코드를 사용해야 한다 (ROOM은 필요 없음) SQLite는 LiveData나 RxJava를 위해 Observation으로 생성해 동작할 수 없다 (ROOM은 할 수 있음) 물론 간단한 사용엔 이만한 DB가 없긴 합니다. ㅎ 그렇기에 SQLite을 먼저 포스팅 해보겠습니다. 1. SQLite를 사용..

    AsyncTask는 왜 deprecated 되었을까?

    AsyncTask는 왜 deprecated 되었을까?

    AsyncTask는 백그라운드에서 작업을 수행할 때 사용합니다. 그리고 그 결과를 UI Thread에서 갱신도 하게 되죠. 최대 몇초간의 짧은 작업에 사용하는게 가장 적절합니다. 특징으로, AsynkTask는 순차적으로 실행되게 되죠. deprecated된 이유는 다음과 같습니다. 1. 따로 명시해주지 않으면 액티비티가 종료되도 메모리에 계속 남아, 메모리 누수가 발생 2. 오직 한번만 실행되고 재사용이 불가능 + 처리작업의 수가 1 (비효율적) 3. Configuration 변경이 일어났을때 crash 가능성 RxJava도 합리적인 대안이지만, 코틀린의 coroutine로 대체하는걸 추천하고 있습니다.

    Retrofit2 간단한 사용법

    Retrofit2 간단한 사용법

    Retrofit이란? OkHttp를 네트워크 계층으로 활용해서 구축한 RESTful HTTP통신 라이브러리 입니다. AsncTask없이 백그라운드 스레드를 실행하며, Callback을 통해 메인스레드에서 UI를 업데이트하게 됩니다. 이후 안드로이드 스튜디오가 메인스레드에서 백그라운드 스레드를 실행하지 못하게 변경되면서 비동기 통신엔 결국 AsncTask를 사용하게 됩니다. Retrofit의 장점 1. AsncTask와 비교해서 빠른 속도. 2. 어노테이션을 사용해 코드가 굉장히 직관적. 3. 간결한 코드로 재사용성 또한 높음 4. 구현히 굉장히 쉬움 Retrofit의 구성요소 1. DTO (Data Transfer Object) - Bean이라고도 부릅니다. POJO를 사용하기도 합니다. 2. Inter..

    Recycler View item handeling

    Recycler View item handeling

    제목 그대로입니다. 가로로 리스트뷰를 제작해야해서 리사이클러뷰를 썼는데, 리사이클러뷰는 아이템에 접근할 수 있는 메서드가 onBindViewHolder뿐입니다. 기존 레이아웃을 재활용할 뿐더러 접근할수 있는 메서드가 하나 (지만 이것도 데이터 바인딩에 사용)밖에 없어서 리스트뷰에 비해서 사용하기가 너무 까다로웠습니다. 혼자서 끙끙대다가 구글링해보니 같은 고민을 하시는 분이 많아 저도 작성해봅니다. 리사이클러뷰에서 단일 아이템을 선택해서, 해당 아이템만 배경색을 바꾸려면 다음과 같은 과정이 필요합니다. 1. 선택된 아이템의 Position을 저장할 전역변수를 생성합니다. 2. onBindViewHolder에서 생성된 ViewHolder를 ArrayList로 유지합니다. + ArrayList의 contain..

    Custom ListView 만들기(1/2) - 설계

    Custom ListView 만들기(1/2) - 설계

    클래스 다이어그램 Adapter를 실체화한 BaseAdapter를 상속받아 CustomAdapter 클래스를 직접 만들었습니다. 하지만, BaseAdapter의 추가기능은 사용하지 않아 BaseAdapter는 다이어그램에서 제외했습니다. Bean의 getter setter가 image밖에 없는데, 흐린눈 부탁드립니다 ㅠㅠ 구조도 Item.xml : 리스트에 넣을 item의 레이아웃 Bean : 리스트에 넣을 데이터 ArrayList : bean의 집합 Adapter : CustomAdapter 구현 순서 1. bean class 구현 2. item.xml 구현 3. CustomAdapter 클래스 구현 4. item에 data 바인딩 *Adapter의 getView()에서 구현 a. 부모뷰를 parent..