안드로이드 192

[Android] Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3

Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3 StateFlow와 SharedFlow는 흐름에서 최적으로 상태 업데이트를 내보내고 여러 소비자에게 값을 내보낼 수 있는 Flow API입니다. # StateFlow 현재 상태와 새로운 상태 업데이트를 수집기에 내보내는 관찰 가능한 상태 홀더 흐름입니다. value속성을 통해서도 현재 상태 값을 읽을 수 있습니다. 상태를 업데이트하고 흐름에 전송하려면 MutableStateFlow 클래스의 value 속성에 새 값을 할당합니다. private val _uiState = MutableStateFlow(LatestNewsUiState.Success(emptyList())..

[Android] DiffUtil에 대해 알아보자

Android DiffUtil 리싸이클러뷰 아이템 구성이 바뀔때, notifyDataSetChanged()로 모든 아이템을 업데이트 하는 방법을 사용해 왔다. 하지만 이 방법은 아이템 개수가 많아질수록 비효율적일 수 밖에 없다. 이런 문제를 알고 구글에서는 DiffUtil이라는 매우 편리한 유틸리티 클래스를 만들었다. 두 리스트의 차이점을 찾아 업데이트 되어야 할 목록을 반환 해 줘서 RecyclerView어댑터에 업데이트를 알리는데 사용 DiffUtil 사용하기 먼저 DiffUtil.Callback을 구현한 클래스를 만들어야 한다. class PersonDiffCallback( private val oldList: List, private val newList: List ) : DiffUtil.Call..

안드로이드 2024.03.20

[Android] MediaStore에서 미디어 파일 정보 읽는 방법

MediaStore에서 미디어 파일 정보 읽는 방법 Media Provider와 MediaStore라는 용어에 대해 알아야 한다. Media Provider 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더 입니다. 이 프로바이더에게 찾고 싶은 종류의 데이터를 쿼리할 수 있습니다. Media Store 앱이 Media Provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다. 쿼리에 필요한 데이터들이 정의되어 있습니다. 따라서, 우리는 MediaStore의 API들이 어떤 의미인지 이해하고, 그 API를 통해 Media Provider에 쿼리를 하여 데이터를 얻으면 됩니다. Android 10(Q)이상 Scoped Storage 부분은 다루지 않겠습니다...

안드로이드 2024.03.20

Android Q 파일 삭제 ScopeStorage 삽질

이미지를 서버에 업로드후에 삭제해야 하는 이슈. * 이미지를 업로드 후에 다른 Task(runnable)에서 파일을 삭제 시켜주는 로직이 들어가 있음.(해당 액티비티에서 삭제가 아님) 나의 삽질을 적어둔 것 하단에 결론만 보셔도 됩니다. 1. SAF로 Uri를 가져옴. : content://com.android.providers.media.documents/document/image%3A328 2. DocumentsContract.deleteDocument를 이용해 삭제 시도. - 실패 : NullPointerException: authority 익셉션 떨어짐. 처음에 가져온 경로를 File(path)하여 삭제 중 이었음. (content:// Uri였기 때문에 경로가 바뀐듯.) 바뀐 경로 : /cont..

안드로이드 2024.03.20

[Android] Gson으로 데이터를 가져오지 못할 때 (코드 난독화)

Gson라이브러리를 이용하여 데이터를 가져왔는데 코드 난독화를 하면 에러가 발생하면서 앱이 종료 되었다. java.lang.NullPointerException: throw with null exception at package.Response$b.hashCode(Unknown Source:3) 1) 해당 data쪽 모델을 keep class로 난독화 해제를 해주었지만 에러남 2) 찾아보니 gson.fromJson이 일을 제대로 하고 있지 않다고 한다. 해결방법 1) gradle.properties파일을 열고 android.enableR8=false 2) proguard-rules.pro 파일에 R8 방지 코드를 추가. -keepclassmembers,allowobfuscation class * { @c..

[Android] FCM을 사용해서 메시지를 보내는 과정 (FCM 추가)

FCM을 사용해서 메시지를 보내는 과정 1. 토큰 요청 및 획득 먼저 사용자가 앱을 설치하고 최초 실행시 토큰을 얻기위해 클라우드 서버에 요청을 보내고 토큰을 획득 2. 서버에 토큰 저장 획득한 토큰을 서버로 전송하여 서버 db에 저장 3. 토큰을 이용해 메시지 전송 요청 서버에서 클라우드로 메시지 데이터와 함께 토큰을 보내 전송을 요청 4. 메시지 전송 클라우드는 요청 받은 메시지를 토큰에 해당하는 단말기에 전송 5. 리스너를 통해 메시지 수신 앱이 실행중이 아니더라도 리스너를 통해 메시지를 수신할 수 있다. 프로젝트 설정 1. 구글 firebase console접속 2. 안드로이드 프로젝트 생성 후 google-service.json을 다운 받아 앱 모듈 루트 디렉토리에 넣는다. 안드로이드 스튜디오 ..

안드로이드 2024.03.19

[Android] Exoplayer란?

스트리밍 https://developer.android.com/codelabs/exoplayer-intro#0 ExoPlayer를 사용한 미디어 스트리밍 | Android Developers 이 Codelab에서는 Android YouTube 앱에서 실행되는 오픈소스 미디어 플레이어인 ExoPlayer를 사용하여 미디어 플레이어를 빌드하여 오디오 및 가변 품질 동영상 스트림을 렌더링합니다. Codelab에서는 라 developer.android.com Exoplayer란? 안드로이드에서 영상 재생을 위해 사용하는 플레이어로 기본 내장 라이브러리인 MediaPlayer가 있었는데 스트리밍 서비스가 주류를 이루면서 구글에서 DASH와 SmoothStreaming을 지원하는 ExoPlayer라이브러리를 도입했..

안드로이드 2024.03.18

[Android] 카메라 촬영 Android10이상과 그 이하

안드로이드 카메라 촬영 Android10과 그 이하 1)Android 10 이상은 외부저장소 경로를 가져올수가 없다. 그래서 MediaStore를 이용하여 Media저장을 해야한다. 권한은 카메라만 있어도 저장됨. 2)Android 10 미만은 외부저장소를 사용 할 수 있으니 외부저장소에 생성하여 저장. 권한은 카메라, 외부저장소(Read, Write)필요. -문제: 처음에 1)방법으로 해보았는데 Andrid9(갤럭시8)에서 사진촬영 후 uri에 값이 null임, intent.data에 uri들어있음 사진 촬영된 것도 조그만한 이미지로 잡혀서 실제 사용을 못할 정도(섬네일 사진을 가져오는듯) -찾은방법: 2)방법을 사용하면서 FileProvider를 이용해 파일공유를 해주어 원본을 가져오는 법 2-1)..

[Android] WorkManager

# 공부하게된 이유 FCM 알림을 받던 도중 포그라운드 서비스를 시작하는 이슈가 발생! Android 12 이상을 타겟팅하는 앱은 특별한 사례 몇 가지를 제외하고 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 WorkManager를 사용하여 신속 처리 작업을 예약하고 시작해 보세요. 신속히 처리해야 하는 사용자 요청 작업을 완료하려면 정확한 알람 내에서 포그라운드 서비스를 시작하세요. 앱 성능과 UX를 개선하기 위해 Android 12 이상을 타겟팅하는 앱은 알림 트램펄린으로 사용되는 서비스나 broadcast receiver에서 활동을 시작할 수 없습니다. 즉, 사용자가 알림을 탭하거나 알림 내에서 작업 버튼을 탭한 후, 앱은 서비스나 broad..

안드로이드 2024.03.18

푸시 알림 처리를 위한 PendingIntent 및 onNewIntent 사용하기

푸시 작업을하면서 푸시 클릭했을 때 onNewIntent를 타게 해야했고, 계속 화면의 onCreate만 타게 되어 고민하던 상황에 알게된 점입니다! PendingIntent를 사용하여 푸시 알림을 탭할 때 앱의 동작을 제어하는 방법과 함께, onNewIntent() 메서드를 사용하여 알림을 처리하는 방법에 대해 알아보겠습니다. PendingIntent란? PendingIntent는 다른 애플리케이션이 특정한 인텐트를 나중에 실행할 수 있는 권한을 부여하는 메커니즘입니다. 이를 통해 다른 애플리케이션이 사용자의 액션에 대응하여 원하는 동작을 수행할 수 있습니다. 푸시 알림 처리를 위한 PendingIntent 및 onNewIntent 사용하기 푸시 알림을 받았을 때 사용자가 알림을 탭했을 때 앱의 동작을..

안드로이드 2024.03.14