분류 전체보기 411

[Android] 안드로이드 잠금 화면, 슬립 깨우기

Android 잠금 화면, 슬립 깨우기 잠금화면을 해제할 액티비티의 onCreate 에 추가 하였습니다. private fun turnScreenOnAndKeyguardOff() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { setShowWhenLocked(true) setTurnScreenOn(true) window.addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON ) } else { window.addFlags( WindowManager.LayoutParams.FLAG_SHOW_W..

안드로이드 2024.03.26

아키텍처는 왜 중요한가? (MVC, MVP, MVVM, Clean Architecture, ViewModel, 모듈) 알아 보자!

아키텍처는 왜 중요한가? (MVC, MVP, MVVM, Clean Architecture, ViewModel, 모듈) 알아 보자! 아키텍처는 왜 중요한가? 모바일의 특징을 고려 네트워크적 특징을 고려 사용자 이벤트 다른앱들의 실행. 전화 문자 등등 반응형 프로그래밍 (코루틴, RX Java 등) 이런것들의 동시에 일어난다. 빠른 배포가 필요 비지니스의 확장을 위해서 모듈화가 필요하고 확장에 유연해야한다. 실험적인 기능을 가설을 세우고 특정유저에게 보낸다 → 좋은 아키텍처가 뒷받침 Network Drivien UI → 비지니스 모델에 따라 지원해야할수도 있음 테스트를 위함 확장성이 좋은 앱, 모듈간의 커플링이 낮음 → 결국 테스트하기 좋은 앱 아키텍처는 답이 없음 (중요!) 앱에 실질적으로 도움이 되는것을..

안드로이드 2024.03.26

[Android] 루팅이란? 루팅 체크 방법

루팅(Rooting)이란? 모바일 기기에서 구동되는 안드로이드 운영 체제 상에서 최상위 권한(루트 권한)을 얻어 생산자 측에서 걸어놓은 제약을 해제하는 행위 Android 기기 루팅 되었는지 확인하는 방법 단계 1) 기기 루팅 시도 단계 2) Root Checker라는 무료 앱 설치 단계 3) 앱을 실행하고 'Verify Root Access' 버튼을 탭합니다. 단계 4) 앱은 기기를 성공적으로 루팅했는지 여부를 알려줍니다. 단계 5) 기기가 루팅된 경우 좋습니다. 그렇지 않은 경우 One Click Root를 설치하여 문제를 해결하십시오. 루트 검사기는 어떻게 작동합니까? Root Checker는 Android 스마트폰 또는 태블릿에서 루트 액세스 권한을 테스트하는 간단한 앱입니다. 이를 위해 Root..

안드로이드 2024.03.22

[Android] AudioFocus 관리, MediaPlayer, AudioManager

안드로이드 프레임워크에서 소리와 영상을 재생하기 위해 사용되는 클래스는 아래와 같습니다. # MediaPlayer 오디오 및 비디오 파일과 스트림 재생을 위해 쓰입니다. 소리와 영상을 재생하기 위한 기본 API입니다. # AudioManager 기기의 오디오 소스와 오디오 출력을 관리하는 클래스입니다. # Audio Focus 2개 이상의 앱이 audio를 하나의 stream으로 동시에 재생할 수 있다. 시스템들은 이것을 믹스한다. 이는 유저에게 소음이 될 수 있다. 이를 예방하기 위해 Audio Focus라는 개념을 도입. 하나의 앱만 audio focus를 가질 수 있다. 앱이 audio output을 하려면, audio focus를 요청해야 한다. focus를 획득하면 소리를 재생할 수 있다. 획득..

안드로이드 2024.03.20

Android 12이상 Notification & BroadCastReceiver, Service StartActivity문제

Android 12이상 Notification & BroadCastReceiver, Service StartActivity문제 안드로이드 OS버전 12이상에서 노티피케이션 받았을 때 푸시가 오지 않는 이슈가 발생하였다. 앱종료 되어있을 때 푸시받아서 ForegroundService도 실행해 줘야 하는데 OS버전 12이상에서 백그라운드 실행을 더 제한하여 실행이 되지 않았음. FCM의 priority를 서버에서 High로 받으니 푸시가 오는 것을 확인하였다. 또 다른 방법은 WorkManager로 마이그레이션 하라고 되어있는데 그렇게까진 하지 않았습니다. ForegroundService에서 notification 문제도 발생. remoteView로 커스텀뷰를 사용하고 BroadCastReceiver로 이벤..

[Android] CoroutineScope, CoroutineContext, CoroutineBuilder, suspend Function

#CoroutineScope 코루틴이 실행되는 범위로, 코루틴을 실행하고 싶은 Lifecycle에 따라 원하는 Scope를 생성하여 코루틴이 실행될 작업 범위를 지정할 수 있습니다. 사용자 지정 CoroutineScope: CoroutineScope(CorountineContext) ex) CoroutineScope(Dispatchers.Main) // Dispatchers.Main, Dispatchers.Default, Dispatchers.IO, Job()... // 메인 쓰레드에서 실행될 사용자 정의 Scope val scope = CoroutineScope(Dispatchers.Main) scope.launch { // 메인 쓰레드 작업 } // 백그라운드에서 실행될 사용자 정의 Scope Cor..

[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