[Android] MQTT + SSL + MQTTX 사용해보기
·
Android/MQTT
[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/MQTT
안드로이드에서 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/ConstraintSet
ConstraintSet은 xml에서 ConstraintLayout이 하는 동작을 코드 상으로 할 수 있게 해주는 클래스이다. 앱에서 어떤 조건에 따라 한 레이아웃을 화면 상단에 배치하거나 하단에 배치하는 등의 연출이 가능하다. 예제로 버튼을 클릭했을 때 검정색 뷰의 위치를 옮겨보려고 한다. 상단, 중단, 하단 텍스트가 존재하고 각 텍스트마다 이동 버튼이 존재한다. 이동 버튼을 클릭하면 검정색의 뷰가 해당 텍스트 아래로 이동된다. 참고 자료 ConstraintSet 예제 class MainActivity : AppCompatActivity() { private lateinit var mBinding: ActivityMainBinding override fun onCreate(savedInstanceSta..
[Android] addView로 Layout에 View 추가하기
·
Android/AddView
addView는 지정한 Layout에 동적으로 View를 추가할 수 있는 메서드이다. addView를 사용하여 화면 순서 편집과 같은 기능을 구현할 수 있다. 코드상으로 View를 만들고 addView를 통해 Layout에 추가할 수 있지만, 이번에는 xml에서 View를 등록하고 Layout에 추가하려 한다. 다만 xml에서 View를 먼저 등록하게 되면 Parent View에 종속되기 때문에 addView를 사용하기 전에 해당 View의 부모 ViewGroup에서 removeView를 사용해야 한다. 예제로 버튼을 클릭하면 각 버튼에 해당하는 TextView를 LinearLayout에 추가하려고 한다. 예제 코드 class MainActivity : AppCompatActivity() { privat..
[Android] Cipher를 사용하여 암호화 복호화 해보기
·
Android/Cipher
Cipher는 암호화와 복호화를 위한 기능을 제공한다. 예제로 EditText에 텍스트를 입력하고 '암호화' 버튼과 '복호화' 버튼을 클릭하여 입력한 텍스트가 어떻게 표시되는지 보여주려고 한다. 1. MessageDigest를 사용하여 Hash 키 생성 2. Cipher.getInstance로 객체 생성 3. SecretKeySpec을 통해 '1'의 Hash 키를 비밀키로 변환 4. Cipher.init으로 초기화하여 암호화 또는 복호화 작업 수행 MessageDigest를 사용하여 Hash 키 생성 Cipher를 사용하려면 해시 키가 필요하다. 해시 키는 MessageDigest로 만들 수 있다. /** * 주어진 바이트 배열과 알고리즘을 사용하여 해시키를 반환. */ private fun hashSH..
[Android] EncryptedSharedPreferences로 암호화 하기
·
Android/SharedPreferences
SharedPreferences로 기기 내에 간단한 데이터를 저장하곤 하는데, 데이터가 실명이나 핸드폰 번호와 같은 개인 정보라면 암호화하여 저장할 필요가 있다. 처음 기기에 저장을 할 때 value를 암호화하여 저장할 수 있지만, 안드로이드에서는 EncryptedSharedPreferences를 제공한다. EncryptedSharedPreferences는 MasterKey를 이용하여 암호화된 SharedPreferences 객체를 생성한다. 예제로 EditText에 입력한 텍스트를 암호화하여 저장하고 불러오기 버튼을 통해 저장된 value를 TextView로 보여주려고 한다. 참고 자료 EncryptedSharedPreferences 의존성 추가 // EncryptedSharedPreferences i..
[Android] TextWatcher로 텍스트 변경될 때마다 이벤트 처리하기
·
Android/TextWatcher
앱에서 텍스트를 입력 중에 무언가 잘못되었다고('잘못된 입력 형식' 문구 또는 에러 ui 표시) 사용자에게 알려주는 것을 본 적이 있을 것이다. 안드로이드에서 TextWatcher라는 인터페이스를 제공하는데 TextWatcher에 정의된 메서드들을 사용하여 앞에서 말한 기능들을 구현할 수 있다. 참고 자료 TextWatcer의 메서드 TextWatcher에는 beforeTextChanged, onTextChanged, afterTextChanged가 있다. onTextChanged는 변경된 문자열을 보여주는데 afterTextChanged가 세분화 된 것으로 보인다. 그래서 beforeTextChanged와 onTextChanged를 비교해보려 한다. mBinding.etCompare.addTextCha..
[Android] Expandable RecyclerView 구현하기
·
Android/RecyclerView
리스트에서 게시물을 클릭했을 때 게시물 아래로 콘텐츠가 펼쳐지는 앱을 본 적이 있을 것이다. 아이템을 클릭했을 때 내용을 보이거나 숨기거나 하는 기능에 Expandable이라고 명칭을 붙이는 것 같다. ListView에서는 ExpandalbeListView라는 Widget이 존재하지만 RecyclerView에는 없다. 따라서 Expandable RecyclerView를 직접 구현해야 한다. Expandable RecyclerView는 아이템을 클릭했을 때 현재 목록이 펼쳐졌는지 닫혀있는지 알 수 있도록 하는 상태 값이 필요하다. 그리고 상태 값에 따라서 내용을 visible하거나 gone 처리를 하면 된다. 예제로 RecyclerView의 아이템을 클릭했을 때 목록을 펼치고 다시 누르면 닫히는 앱을 만들..
[Android] BottomSheetDialog 사용하기
·
Android/Dialog
BottomSheetDialog는 하단에서 나타나는 Dialog로 xml을 통해 자신이 사용하고자 하는 데로 커스텀할 수 있다. 기본적으로 Dialog를 띄우려는 곳에 BottomSheetDialog의 객체를 만들어서 종속된 메서드들을 사용하면 되지만, 여러 화면에서 공용으로 사용하고 싶다면 BottomSheetDialog를 Builder 패턴의 클래스로 만들어 사용하는게 좋다고 생각한다. 예제로 버튼을 누르면 BottomSheetDialog를 띄우고 '취소' 버튼을 누르면 Dialog를 내리고, '확인' 버튼을 누르면 Toast를 띄우려고 한다. Builder 패턴을 사용한 Dialog 클래스 만들기 class CustomBottomSheetDialog(context: Context) : BottomS..
[Android] SharedPreferences로 검색 리스트 만들기
·
Android/SharedPreferences
[Android] SharedPreferences에 ArrayList로 저장하기 안드로이드에서 가벼운 데이터를 저장하기 위해 SharedPreferences를 사용하곤 한다. ShardPreferences는 key-value 형태로 기기에 데이터를 저장된다. value에는 String, Int, Boolean과 같은 자료형들을 담을 수 ogyong.tistory.com 저번에 SharedPreferences에 ArrayList로 저장하는 것을 해봤는데, 이것을 활용해서 검색 리스트를 만들어보려고 한다. 검색 리스트는 RecyclerView로 표현할 거고, 검색 완료를 했을 때 Adapter에 있는 리스트를 갱신할 것이다. Adapter 작업 class SearchListAdapter: RecyclerVi..
[Android] ViewPager2로 TabLayout 구성하기
·
Android/TabLayout
한 화면에 여러 콘텐츠를 보여주기 위해 다양한 앱에서 TabLayout과 ViewPager를 사용한다. 이 두 가지 기능을 사용하면 탭을 클릭하거나 스와이프를 하여 콘텐츠를 변경할 수 있다. TabLayoutMediator를 사용하여 해당 기능을 구현해 보려고 한다. 예제로 4개의 탭에 각 탭을 구분할 수 있도록 '첫번째' ~ '네번째'라고 텍스트가 적힌 프로젝트를 만들어봤다. TabLayout 설정 /** * TabLayout 설정 */ private fun faqTabInit() { TabLayoutMediator(mBinding.tabMain, mBinding.vpMain) { tab, pos -> tab.text = pos.toString() when (pos) { 0 -> tab.text = g..
[Android] Unsupported Modules Detected
·
Android/이슈 처리
패키지 명을 변경한 것을 적용하기 위해 build.gradle(:app)에서 applicationId를 변경하고 sync를 했는데, Unsupported Modules Detected: Compilation is not supported for following modules: . Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project. 라는 에러가 발생했다. 이상하게 빌드는 성공했는데 Binding을 import 하는 부분부터 빨간줄이 사라지지 않았다. Clean Project와 Rebuild Project를 해도 사라지지 않았는데, 해당 프로젝트의 .idea 폴더를 삭제하고 안드로이드 스..