전체 글71 [Android] MQTT + MQTTX 사용해보기 안드로이드에서 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/MQTT 2022. 12. 6. [Android] ConstraintSet으로 View의 제약조건 수정하기 ConstraintSet은 xml에서 ConstraintLayout이 하는 동작을 코드 상으로 할 수 있게 해주는 클래스이다. 앱에서 어떤 조건에 따라 한 레이아웃을 화면 상단에 배치하거나 하단에 배치하는 등의 연출이 가능하다. 예제로 버튼을 클릭했을 때 검정색 뷰의 위치를 옮겨보려고 한다. 상단, 중단, 하단 텍스트가 존재하고 각 텍스트마다 이동 버튼이 존재한다. 이동 버튼을 클릭하면 검정색의 뷰가 해당 텍스트 아래로 이동된다. 참고 자료 ConstraintSet 예제 class MainActivity : AppCompatActivity() { private lateinit var mBinding: ActivityMainBinding override fun onCreate(savedInstanceSta.. Android/ConstraintSet 2022. 12. 1. [Android] ExifInterface와 Matrix로 이미지 회전 시키기 프로필 이미지를 변경하면 서버에 uri를 전달하고, 서버에서 이미지의 새 uri를 받아서 Glide를 통해 보여주고 있었다. 문제는 갤러리에서 선택한 캡처와 다운로드된 이미지는 프로필에 정상적으로 등록이 됐는데, 폰으로 촬영한 이미지의 경우에는 등록된 프로필 이미지를 보면 사진이 회전되어 있었다. ExifInterface와 Matrix를 이용하면 해결할 수 있다고 한다. 해결 과정은 아래와 같다. 1. ExifInterface로 이미지의 회전 정보를 알아낸다. 2. Matrix를 이용해 회전한 값만큼 회전시킨다. 3. 새로운 Bitmap을 만들고 Matrix를 적용시킨다. 4. Bitmap을 파일에 저장하여 uri 정보를 얻는다. 5. 새로 얻은 uri를 서버에 전달한다. 이미지 회전 예제 예제로 회전된.. 작업 일지 2022. 11. 29. [Android] addView로 Layout에 View 추가하기 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/AddView 2022. 11. 28. [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/Cipher 2022. 11. 24. [Android] EncryptedSharedPreferences로 암호화 하기 SharedPreferences로 기기 내에 간단한 데이터를 저장하곤 하는데, 데이터가 실명이나 핸드폰 번호와 같은 개인 정보라면 암호화하여 저장할 필요가 있다. 처음 기기에 저장을 할 때 value를 암호화하여 저장할 수 있지만, 안드로이드에서는 EncryptedSharedPreferences를 제공한다. EncryptedSharedPreferences는 MasterKey를 이용하여 암호화된 SharedPreferences 객체를 생성한다. 예제로 EditText에 입력한 텍스트를 암호화하여 저장하고 불러오기 버튼을 통해 저장된 value를 TextView로 보여주려고 한다. 참고 자료 EncryptedSharedPreferences 의존성 추가 // EncryptedSharedPreferences i.. Android/SharedPreferences 2022. 11. 24. [Android] 폴더블 기기를 접거나 폈을 때 UI 처리 [Android] 폴더블 기기 UI 대응하기 일반적인 스마트 폰에 맞춰서 개발을 하다가 갤럭시 폴드를 접하고 나서 문제가 생겼다. 대부분의 위젯에 width와 height을 고정 dp 값으로 사용했는데 갤럭시 폴드가 접혀있을 때는 위젯이 잘리고, ogyong.tistory.com 이전에 폴더블 기기의 UI를 어떻게 대응했는지 글을 작성했었는데, 폴더블 기기를 접거나 폈을 때 어떻게 처리했는지에 대해서도 정리하려고 한다. 기기가 회전하거나 사이즈가 변경(접기, 펴기 등)되면 화면이 재구성되어 Activity가 onCreate부터 다시 시작하게 된다. android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|smallestScreen.. 작업 일지 2022. 11. 24. [Android] 기기 화면을 가로, 세로로 회전 시키기 [Android] Screen Size로 폰과 태플릿 구분하기 홈 트레이닝 서비스 프로젝트 중에 폰은 세로모드, 태블릿은 가로모드로 고정을 해달라는 요청을 받았다. 현재 사용 중인 기기가 폰인지 태블릿인지를 구하고 가로 또는 세로모드를 고정시켜야 ogyong.tistory.com 이전 글에서 기기 타입에 따라 가로, 세로 화면을 고정시켜야 하는 작업을 해야한다고 했는데, 이번에는 기기 화면을 회전 시키는 것을 해보려고 한다. 기기의 화면을 회전 시키려면 Activity의 requestedOrientation을 업데이트 해야한다. requestedOrientation(set, get)은 Manifest에서 등록한 가로, 세로 방향 값이나 마지막으로 set한 값을 반환한다. 반환하는 값은 ActivityIn.. 작업 일지 2022. 11. 24. [Android] Screen Size로 폰과 태플릿 구분하기 홈 트레이닝 서비스 프로젝트 중에 폰은 세로모드, 태블릿은 가로모드로 고정을 해달라는 요청을 받았다. 현재 사용 중인 기기가 폰인지 태블릿인지를 구하고 가로 또는 세로모드를 고정시켜야겠다고 생각했다. 기기의 타입을 확인하는 방법은 안드로이드의 Configuration에서 제공하는 screenLayout을 사용하면 된다. 우선 screenLayout은 화면 전체 레이아웃에 대한 비트 마스크라고 한다. (비트 마스크 : 비트를 마스킹하는 기술로 비트 연산을 통해 정수의 이진 비트를 처리하는 작업) Configuration에는 ScreenLayout에 대한 정적 변수들이 있다. 그중 SCREENLAYOUT_SIZE_MASK는 screenLayout의 크기를 인코딩하는 비트라고 한다. • SCREENLAYOUT.. 작업 일지 2022. 11. 23. [Android] TextWatcher로 텍스트 변경될 때마다 이벤트 처리하기 앱에서 텍스트를 입력 중에 무언가 잘못되었다고('잘못된 입력 형식' 문구 또는 에러 ui 표시) 사용자에게 알려주는 것을 본 적이 있을 것이다. 안드로이드에서 TextWatcher라는 인터페이스를 제공하는데 TextWatcher에 정의된 메서드들을 사용하여 앞에서 말한 기능들을 구현할 수 있다. 참고 자료 TextWatcer의 메서드 TextWatcher에는 beforeTextChanged, onTextChanged, afterTextChanged가 있다. onTextChanged는 변경된 문자열을 보여주는데 afterTextChanged가 세분화 된 것으로 보인다. 그래서 beforeTextChanged와 onTextChanged를 비교해보려 한다. mBinding.etCompare.addTextCha.. Android/TextWatcher 2022. 11. 23. [Android] 폴더블 기기 UI 대응하기 일반적인 스마트 폰에 맞춰서 개발을 하다가 갤럭시 폴드를 접하고 나서 문제가 생겼다. 대부분의 위젯에 width와 height을 고정 dp 값으로 사용했는데 갤럭시 폴드가 접혀있을 때는 위젯이 잘리고, 펼쳐져 있을 때는 위젯의 크기가 작아 보이거나 위젯들 사이의 여백이 너무 크다는 것이었다. 처음 이 문제를 직면하고 나서는 ConstraintLayout의 bias 속성을 사용해서 반응형으로 처리하면 될 것이라고 생각했다. bias를 사용하면 일반폰과 폴더블 폰이 접혔을 때는 UI가 괜찮게 나온다. 하지만 폴더블 폰이 펼쳐졌을 때 해상도가 높다 보니 버튼 크기가 이상하게 보일 정도로 커지는 문제가 있었다. 기기 타입 찾기 이 문제를 해결하려면 기기 타입별로 다른 dp 값을 적용시켜야 한다고 생각이 들었다... 작업 일지 2022. 11. 22. [Android] Expandable RecyclerView 구현하기 리스트에서 게시물을 클릭했을 때 게시물 아래로 콘텐츠가 펼쳐지는 앱을 본 적이 있을 것이다. 아이템을 클릭했을 때 내용을 보이거나 숨기거나 하는 기능에 Expandable이라고 명칭을 붙이는 것 같다. ListView에서는 ExpandalbeListView라는 Widget이 존재하지만 RecyclerView에는 없다. 따라서 Expandable RecyclerView를 직접 구현해야 한다. Expandable RecyclerView는 아이템을 클릭했을 때 현재 목록이 펼쳐졌는지 닫혀있는지 알 수 있도록 하는 상태 값이 필요하다. 그리고 상태 값에 따라서 내용을 visible하거나 gone 처리를 하면 된다. 예제로 RecyclerView의 아이템을 클릭했을 때 목록을 펼치고 다시 누르면 닫히는 앱을 만들.. Android/RecyclerView 2022. 11. 22. 이전 1 2 3 4 5 6 다음