[Android] Could not find method kapt() for arguments ···
·
Android/이슈 처리
Caused by: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method kapt() for arguments [androidx.room:room-compiler:2.4.3] on object of type org․gradle․api․internal․artifacts․dsl.dependencies.DefaultDependencyHandler. build.gradle에서 kapt 관련 의존성을 추가하고 sync를 했을 때 에러가 발생했다. 원인은 kotlin-kapt을 plugins에 추가하지 않아서였다. plugins { id 'com.android.appli..
[Android] USB 디버깅이 계속 끊길 때
·
Android/ADB
작업 관리자를 보면 adb.exe가 Android Studio에서 실행되거나 백그라운드 프로세스에서 실행되는데, adb가 종료와 실행을 반복하고 있었다. 이럴 때 안드로이드 스튜디오를 실행하지 않고 Shell에서 adb를 먼저 실행시켜 주면 디버깅이 해제되지 않는다. Windows PowerShell을 열고 'adb start-server'를 입력하여 Windows PoswerShell에서 adb가 실행되도록 한다. 아래 이미지처럼 설정이 되었을 때 디버깅이 끊기지 않았다. 처음에는 안드로이드 스튜디오를 먼저 실행하고 'adb kill-server'을 사용해서 안드로이드 스튜디오의 adb를 종료시켰다. 그 뒤에 Shell에서 adb를 실행시켰는데 잘 동작할 때도 있었지만, 안드로이드 스튜디오와 Shell..
[Android] Could not resolve all files for configuration ':app:debugCompileClasspath'.
·
Android/이슈 처리
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':app:debugCompileClasspath'. 에러가 발생했는데, build.gradle(Project) 파일에 jcenter() 를 추가하여 해결했다. repositories { google() jcenter() mavenCentral() }
[Android] RecyclerView에서 페이징 처리하기 #1
·
Android/UI
RecyclerView에서 리스트를 스크롤하다가 어느 순간에 로딩 화면이 뜨면서 리스트가 늘어나는 것을 본 적 있을 것이다.Adapter에서 등록된 list가 마지막에 도달했을 때를 감지하여 로딩 화면을 띄우고 다음 페이지를 호출하는 것이다. RecyclerView는 스크롤 상태와 리스트의 포지션에 대한 정보를 알려주는 addOnScrollListener 메서드를 제공한다.addOnScrollListener를 이용해서 페이징 처리를 해보려고 한다.RecyclerView 페이징 예제 1번 2번 3번 4번 5번 6번 7번 8번 9번 10번 11번 ..
[Android] DrawerLayout으로 Side Navigation 구현하기
·
Android/UI
DrawerLayout은 자식 레이아웃 중 하나를 펼치고 접는 기능을 하게 해주는 레이아웃이다. 자식 레이아웃 중 하나에 layout_gravity 속성을 start(left)나 end(right)를 부여하는 것으로 DrawerLayout을 쓸 수 있다.단, layout_gravity 속성을 가진 자식 레이아웃은 하나여야 하고 layout_height은 match_parent가 되어야 한다.(그렇지 않으면 런타임 에러가 발생한다.) drawer로 사용하기 위해 layout_gravity 속성을 지닌 자식 레이아웃 이외에 여러 개를 선언해 봤는데화면에는 마지막에 작성된 레이아웃만 보였다.DrawerLayout을 사용할 때 drawer로 표시할 레이아웃 하나와 메인 콘텐츠를 보여줄 레이아웃까지 해서자식 레이..
[Android] MQTT + SSL + MQTTX 사용해보기
·
Android/Network & Connecting
[Android] MQTT + MQTTX 사용해보기 안드로이드에서 MQTT 통신을 하는 방법은 아래와 같다. 1. org.eclipse.paho:org.eclipse.paho.client.mqttv3에서 제공하는 MqttClient 클래스 사용 2. org.eclipse.paho:org.eclipse.paho.android.service에서 제공하는 MqttAndroidCli ogyong.tistory.com 지난번에 SSL 인증 없이 MQTT를 사용해 봤는데, 이번에는 SSL 인증을 추가적으로 해보려고 한다. (이미 인증서를 가지고 있다고 가정) eclipse에서 MQTT 통신을 하도록 제공하는 클래스는 사용하지 않으려 한다. Android 12 버전부터 오류가 발생하는데, 이 부분을 해결한 hanne..
[Android] MQTT + MQTTX 사용해보기
·
Android/Network & Connecting
안드로이드에서 MQTT 통신을 하는 방법은 아래와 같다. 1. org.eclipse.paho:org.eclipse.paho.client.mqttv3에서 제공하는 MqttClient 클래스 사용 2. org.eclipse.paho:org.eclipse.paho.android.service에서 제공하는 MqttAndroidClient 클래스 사용 3. com.github.hannesa2:paho.mqtt.android에서 제공하는 MqttAndroidClient 클래스 사용 eclipse에서 제공하는 1, 2번을 사용할 경우 SSL 인증서를 인증하는 부분에서 문제가 발생한다. 해당 라이브러리는 업데이트가 진행되지 않아 Android 12 버전에서 오류가 뜬다. 이런 이유로 3번을 사용해서 MQTT 통신을 했..
[Android] ConstraintSet으로 View의 제약조건 수정하기
·
Android/UI
ConstraintSet은 xml에서 ConstraintLayout이 하는 동작을 코드 상으로 할 수 있게 해주는 클래스이다.앱에서 어떤 조건에 따라 한 레이아웃을 화면 상단에 배치하거나 하단에 배치하는 등의 연출이 가능하다. 예제로 버튼을 클릭했을 때 검정색 뷰의 위치를 옮겨보려고 한다.상단, 중단, 하단 텍스트가 존재하고 각 텍스트마다 이동 버튼이 존재한다.이동 버튼을 클릭하면 검정색의 뷰가 해당 텍스트 아래로 이동된다.참고 자료ConstraintSet 예제class MainActivity : AppCompatActivity() { private lateinit var mBinding: ActivityMainBinding override fun onCreate(savedInstanceSta..
[Android] addView로 Layout에 View 추가하기
·
Android/UI
addView는 지정한 Layout에 동적으로 View를 추가할 수 있는 메서드이다.addView를 사용하여 화면 순서 편집과 같은 기능을 구현할 수 있다. 코드상으로 View를 만들고 addView를 통해 Layout에 추가할 수 있지만,이번에는 xml에서 View를 등록하고 Layout에 추가하려 한다. 다만 xml에서 View를 먼저 등록하게 되면 Parent View에 종속되기 때문에addView를 사용하기 전에 해당 View의 부모 ViewGroup에서 removeView를 사용해야 한다. 예제로 버튼을 클릭하면 각 버튼에 해당하는 TextView를 LinearLayout에 추가하려고 한다.예제 코드class MainActivity : AppCompatActivity() { private..
[Android] Cipher를 사용하여 암호화 복호화 해보기
·
Android/Security & Privacy
Cipher는 암호화와 복호화를 위한 기능을 제공한다.예제로 EditText에 텍스트를 입력하고 '암호화' 버튼과 '복호화' 버튼을 클릭하여 입력한 텍스트가 어떻게 표시되는지 보여주려고 한다.1. MessageDigest를 사용하여 Hash 키 생성2. Cipher.getInstance로 객체 생성3. SecretKeySpec을 통해 '1'의 Hash 키를 비밀키로 변환4. Cipher.init으로 초기화하여 암호화 또는 복호화 작업 수행MessageDigest를 사용하여 Hash 키 생성Cipher를 사용하려면 해시 키가 필요하다. 해시 키는 MessageDigest로 만들 수 있다./** * 주어진 바이트 배열과 알고리즘을 사용하여 해시키를 반환. */private fun hashSHA256(): B..
[Android] EncryptedSharedPreferences로 암호화 하기
·
Android/Data
SharedPreferences로 기기 내에 간단한 데이터를 저장하곤 하는데, 데이터가 실명이나 핸드폰 번호와 같은 개인 정보라면 암호화하여 저장할 필요가 있다. 처음 기기에 저장을 할 때 value를 암호화하여 저장할 수 있지만, 안드로이드에서는 EncryptedSharedPreferences를 제공한다. EncryptedSharedPreferences는 MasterKey를 이용하여 암호화된 SharedPreferences 객체를 생성한다. 예제로 EditText에 입력한 텍스트를 암호화하여 저장하고 불러오기 버튼을 통해 저장된 value를 TextView로 보여주려고 한다. 참고 자료 EncryptedSharedPreferences 의존성 추가 // EncryptedSharedPreferences i..
[Android] TextWatcher로 텍스트 변경될 때마다 이벤트 처리하기
·
Android/UI
앱에서 텍스트를 입력 중에 무언가 잘못되었다고('잘못된 입력 형식' 문구 또는 에러 ui 표시) 사용자에게 알려주는 것을 본 적이 있을 것이다.안드로이드에서 TextWatcher라는 인터페이스를 제공하는데 TextWatcher에 정의된 메서드들을 사용하여 앞에서 말한 기능들을 구현할 수 있다.참고 자료TextWatcer의 메서드TextWatcher에는 beforeTextChanged, onTextChanged, afterTextChanged가 있다.onTextChanged는 변경된 문자열을 보여주는데 afterTextChanged가 세분화 된 것으로 보인다.그래서 beforeTextChanged와 onTextChanged를 비교해보려 한다. mBinding.etCompare.addTextChangedLi..