목록안드로이드/안드로이드 개발 (64)
우찬쓰 개발블로그
다국어 앱을 만들다보면, 유저가 입력한 문자열이 무슨 언어인지 알아야 할 때가 있다. 필자의 경우 번역기를 만드는데 해당 유저가 태국어를 입력한 것인지, 영어를 입력한 것인지, 한글을 입력한 것인지 알아야 했다. 관련 라이브러리를 찾아보니 성능적인 문제도 있고, 내가 필요한 언어만 지원하게 만들어 두지 않아서 마음에 들지 않았다. 그럼 간단하게 언어를 감지하는 법을 알아보자. 기본적으로 UTF-8 이라는 가정하에 진행한다. fun isProbablyEnglish(s: String): Boolean { var i = 0 while (i < s.length) { val c = s.codePointAt(i) if (c in 0x0041..0x007A) return true i += Character.charC..
큰 파일을 다운로드하여 안드로이드 저장소에 넣어야 하는 경우, 유저의 네트워크 상황에따라 오래 걸리는 경우가 있을 수 있다. 이런 경우를 대비하여 유저 편의성을 위해 progress bar를 표시해주어야 하는데, 직접 하나하나 구현해 보도록 하자. 1. 먼저 간단하게 Retrofit Service 클래스를 만든다. interface RetrofitService { /** * 파일 요청. */ @GET("테스트 파일이 있는 url path") fun requestFile(): Flowable } 가볍게 하기위해 API 요청시 필요한 데이터는 없다고 가정한다. 2. 이 파일을 내려받는 과정에서의 진행도를 노티받기 위하여 ResponseBody를 상속받은 클래스를 하나 만들어야한다. class Progress..
안드로이드를 개발하다보면 유선으로 adb를 설정할 수 없는 상황이 생기기도 한다. 예를들어 필자의 경우, 태블릿에 usb로 IOT 보드를 연결하고 디버깅해야하는데 usb포트가 하나이다보니 adb를 유선으로 할 수가 없었다. 이런경우를 위하여 adb 원격 설정을 해보자. 먼저 안드로이드 기기에 유선으로 adb 연결후 터미널에 다음과 같이 명령어를 입력한다. adb tcpip 5555 여기서 5555는 포트번호를 의미하는데, 원하는 포트로 설정한다. restarting in TCP mode port: 5555 라는 메시지가 나오면 성공적으로 설정된 것이다. 그다음 현재 PC와 같은 공유기 와이파이(혹은 이더넷이라도)에 연결한 후 해당 디바이스의 ip 주소와 포트번호를 이용하여 adb connect를 시도한다..
안드로이드 앱을 개발하다보면, 여러가지 상황에서 (토큰만료, 로그아웃 버튼 등) 로그아웃 로직을 구현해야 한다. 직접 하나하나 activity를 종료해가며 구현하는 짓을 하는 사람은 없을 것이라 보고, 그렇다면 함수 하나로 모든 activity를 종료하고 로그인 activity를 시작하게 하는 방법은 없을까? 그래서 구현해봤다. /** * 강제 로그아웃. */ fun executeSignOut() { UserRepository.INSTANCE.deleteUserData() // 유저 데이터 삭제 val context = TestApplication.getApplicationContext() val intent = Intent(context, SignInActivity::class.java) intent...
1. 프로가드 # 소스 파일 변수 명 바꾸는 옵션. -renamesourcefileattribute SourceFile # 어노테이션 바꾸지 않는 옵션. -keepattributes *Annotation* # 소스 파일의 라인을 섞지 않는 옵션. -keepattributes SourceFile,LineNumberTable -keep public class * extends java.lang.Exception 2. build.gradle에 minifyEnabled 체크 3. manifests - 각 엑티비티 launch mode ( splash는 singleTop, 나머지는 singleTask) - 각 엑티비티 screenOrientation (예외사항을 제외하고 portrait로 고정) 4. 각 disp..
안드로이드 툴바에는 기본적으로 좌측에 대하여 padding 값이 들어가있다. 이것을 지우기 위해선 다음처럼 두가지 옵션을 주도록 하자. 간단하다
안드로이드 앱을 업데이트하면 foreground service가 있는 앱일 경우에는 업데이트 후 앱을 실행시키지 않아도 서비스를 바로 실행시켜줘야 하는 경우가 있다. 이 경우, BroadcastReceiver를 만들어서 해당 이벤트를 받아서 서비스를 실행시키도록 처리하면 된다. 일단 manifest에 다음과 같이 코드가 들어가야한다. 그다음, 브로드캐스트를 상속받아 이벤트를 처리할 클래스를 만든다. class TestBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action.equals(Intent.ACTION_MY_PACKAGE_REPLACED, tr..
activity animation에 대하여 정보를 찾아보면 보통 다음과 같은 방법을 찾을 수 있다. 스타일에 두 옵션에 대한 아이템을 지정하는 방법이다. 하지만 이 방법은 문제가 있는데, 엑티비티를 push 할때와 pop 할때의 애니메이션이 동일하게 지정된다는 것이다. 대부분의 요구사항은 push할때와 대칭이 되도록 pop이 반대의 애니메이션을 가져야하므로 세부 옵션이 필요하다. 이 경우를 위한 대안은 다음과 같다. 이렇게 하면 activity를 open할때와 close 할때에 대한 각 animation의 세부 조정이 가능하다. 각 애니메이션 style의 코드도 추가해 두겠다. 추가로 투명도 조절도 할 수 있는데, 다음처럼 하면된다.
안드로이드에서 status bar와 navigation bar를 둘다 투명으로 바꾸는 방법은 다음처럼 널리 알려져 있다. window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) 하지만 status bar만 투명으로 만들고 싶을 때가 있는데, 이 방법은 생각보다 찾기가 어렵다. status bar만 투명으로 만들때는 다음처럼 하면된다. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_ST..
안드로이드 8부터는 NotificationChannel이 필수가 되면서 다루기가 복잡해 졌는데, 거기다가 설정도 잘 안먹으니 답답한 노릇이다. 본론으로 들어가서, 오레오 이상부터는 다음처럼 꼼수로 진동을 꺼야한다. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( channelId, getString(R.string.push), NotificationManager.IMPORTANCE_LOW // 진동 끄기 ) channel.setShowBadge(true) channel.vibrationPattern = longArrayOf(0) // 진동 끄기 channel.enableVibration(true..