목록안드로이드 (77)
우찬쓰 개발블로그
그냥 다운받을 수 있는 android opencv sdk는 불필요한 모듈이 포함되어있으므로 빌드시 용량이 크다. (https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-android-sdk.zip/download) opencv 소스를 새로 크로스컴파일하여 경량화 해보자. 1. ABI 선택 'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64' 의 총 4개의 ndk cpu종류(ABI)에서, x86과 x86_64(인텔 cpu)용은 용량이 크고, 대부분의 스마트폰은 arm cpu이므로 버려도됨. 'armeabi-v7a', 'arm64-v8a' 두개만 필요. (그냥 다운받을 수 있는 android opencv sd..
안드로이드 풀스크린엔 옵션이 많은데, 그 옵션을 간략히 살펴보자 val decor = window.decorView as FrameLayout var uiOption = window.decorView.systemUiVisibility uiOption = uiOption or SYSTEM_UI_FLAG_HIDE_NAVIGATION or SYSTEM_UI_FLAG_FULLSCREEN or SYSTEM_UI_FLAG_IMMERSIVE_STICKY decor.systemUiVisibility = uiOption SYSTEM_UI_FLAG_HIDE_NAVIGATION - sdk version 14이상 부터 가능한 옵션. 네비게이션바를 가려준다. SYSTEM_UI_FLAG_FULLSCREEN - sdk versio..
quit() : 즉시 루퍼 종료. quitSafely()는 : 메시지 큐에 쌓인 메시지 전부 처리후 루퍼 종료.
보통의 체크박스는 다음과 같다. 보통 여기서 디자인을 넣게되면 다음과 같이 작업을 하곤한다. 이렇게 커스텀으로 이미지를 사용해야하는 경우 android:button="@drawable/custom_image" 를 통해 넣게되는데, 이 방식으로 체크박스 이미지를 변경하는 경우 문제점이 하나 있다. 백그라운드도 또한 체크여부에 따라 디자인이 바뀌어야 되는경우, 정상적인 방법으로는 저 앞에 부분의 공간을 띄울 수가 없다. 이 경우엔 어떻게 해야할까? 이러한 경우를 위해서는 android:button 이 아니라 android:drawableStart에 이미지를 넣어주어야한다. 기존의 button은 @null을 통해 제거한다. background와 체크박스 이미지 사이의 공간은 paddingStart를 통해 조절..
스크롤뷰는 참 편리하지만 가끔씩 원하는 로직의 구현이 어려울 때가 있다. 대표적 예중에 하나가 스크롤뷰 내부에 뷰를 하단에 고정하는 것이다. 다음과 같은 뷰가 있다고 가정해보자. 여기서 요구사항은 '고객센터' 라는 버튼을 최하단에 고정시키기 이다. 각 안드로이드 폰마다 해상도가 다르기 때문에 정확한 방법을 알지 않고는 구현하기가 어렵다. 예를들어서 고객센터를 제외한 부분을 스크롤뷰로 잡고 상위 레이아웃을 Relative Layout으로 잡게되면, 언뜻 성공한것처럼 보이지만 키보드가 올라온 경우 다음과 같은 슬픈 결말을 맞이하게 된다. 우리의 정확한 요구사항은 다음과 같다. 1. 스크롤뷰의 내부가 내용물이 적을 경우에도 하단뷰는 하단에 고정. 2. 스크롤뷰가 스크롤을 넘칠정도로 내용물이 생길 경우에는 하단..
보통 enum class로부터 정의된 값을 찾는다. enum class Test(val value: Int){ A(0), B(1), C(2) } 그런데 0으로 부터 A라는 enum을 찾으려면 어떻게 해야할까? 이를 위해서는 새롭게 fun을 만들어야 한다. object FindTestByValue { private val map = Test.values().associateBy(Test::value) fun fromValue(value: Int) = map[value] } 이렇게 funtion을 구성한 뒤에 fromValue를 호출해서 쓰면 된다. FindTestByValue.fromValue(0) // Test.A가 리턴됨
디자인에 따라서, 성능상 안좋지만 NestedScrollView안에 RecyclerView를 wrap_content로 넣어야 할때가 있다. 이 경우, RecyclerView의 아이템 갱신시 RecyclerView로 포커스가 자동으로 이동하면서 스크롤 되는 경우가 있다. 이럴때는 NestedScrollView의 바로 자식인 layout에 android:descendantFocusability="blocksDescendants" 를 넣어주도록 하자.
안드로이드 스튜디오로 넘어오면서, 보통 라이브러리들이 다 aar파일(Manifest가 포함된 안드로이드 전용 라이브러리) 로 제공되지만, 옛날 이클립스 시절에는 java파일만 포함된 jar파일로 라이브러리가 만들어 졌었다. 예전의 jar 라이브러리들도 잘 만들어진 것들은 아직도 쓰는 경우가 많은데, 간단하게 프로젝트에 추가해보자. 1. 먼저 project의 보기 방식을 project로 바꾸고, 혹은 직접 폴더로 가서 app/libs 에 jar파일을 넣는다. 2. app수준의 gradle에 다음과 같이 추가한다. dependencies { ... implementation files('libs/YourJarFile.jar') ... } 3. 그리고 sync를 돌려주면 바로 사용이 가능하다.
앱 개발을 하다보면 GPS를 사용하여 위경도 값을 얻어와야 하는 경우가 있다. GPS 위치 모드 설정에 따라서 GPS의 측정정확도가 다른데 기본적으로 측정정확도는 디폴트가 '기기전용'으로 되어있다. 안드로이드 설정에서 위치 모드로 들어가면 세가지 종류가 있는데, 그 세가지는 다음과 같다. 높은 정확성(GPS, Wifi, 블루투스, 이동통신망) 배터리 절약(Wifi, 블루투스, 이동통신망) 기기 전용(GPS만 이용) 당연히 GPS 값을 가장 잘 얻어오는 모드는 높은 정확성 이다. 그래서 앱에서 GPS 값을 잘 가져오기 위해서는 높은 정확성으로 바꿔주는 것이 중요한데, 이게 생각보다 샘플코드를 찾기가 어려웠다. 결론적으로는 아래와 같은 코드를 짜게 되었다. 먼저 gradle에 라이브러리를 추가해주어야한다. ..
안드로이드 개발을 하다보면, 알림이나 푸시등이 왔을때 화면이 꺼져있어도 켜주어야 하는 상황이 생긴다. 이 경우는 어떻게 해야할까? 검색해보면 다양한 방법이 있지만, 가장 짧은 소스는 다음과 같다. val pm = getSystemService(POWER_SERVICE) as PowerManager val wLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.ON_AFTER_RELEASE, "myapp:TAG") wLock.acquire()