목록분류 전체보기 (9)
집요정 도비의 일기
I was doing a project that consisted of getting streams from AXIS web cams. I had two functions to implement ; First, play the live stream, Second, play a portion of the live stream's history. The AXIS web cam uses digest auth for authenticating it's stream. The first step was easily done by putting the stream link inside a webview. http://${userName}:${password}@${ip:port}/axis-cgi/mjpg/video.c..
1. Intro 안드로이드 개발하다보면 제일 짜증나고 시간 아까운게 xml의 뷰 컴포넌트들(버튼, 이미지뷰 등등)을 액티비티 코드와 링킹하는 findViewById 과정이다. 안드로이드 해봤으면 굳이 설명 안해도 이게 얼만큼 시간을 쓰레기통에 버리는 일인지 알 수 있다. 본인이 이에 대해 처음 찾아봤을 때는 버터나이프를 쓰라고 글들을 접했으나, 버터나이프도 결국 바인드할 변수는 선언해줘야한다. 그래서 더 찾다가 찾은게 안드로이드 스튜디오의 플러그인인 prettify다. 본인은 이를 도입한지 반년이 넘었는데, 회사 선배가 아직도 findViewById 치고 계신걸 보고 마음이 아파서 공유함. 자동으로 findViewById를 해주는 아주 간단하고 쓰기 편한 플러그인이다. 다음 움짤로 prettify님의 위..
0. Intro 개발하다보면 비동기 요청의 리스폰스를 안드로메다에서 받을 일이 생김. 대표적으로 Ble가 그럼. 예를들어 다음과 같은 순서로 ble장치로 통신을 보내고 받는 경우다. (1) View에서 유저의 버튼 클릭으로 ble전송 요청이 들어옴(2) 적절한 클래스에서 장치에 쓸 byte값을 세팅함.(3) Ble service단에서 연결된 ble장치를 향해 바이트를 씀. (4) Ble service내에서 onCharacteristicChanged에서 장치로부터 받은 콜백을 수신함.(5) 이 결과값을 처음의 view에 전달해야함. 결국 (5)를 어캐 좀 편하게 해보려고 쓰는 것이다. 필자의 경우, 이벤트 버스를 사용하지 않았을 때는 뷰의 메소드를 static으로 정의하여 처리하는 식으로 구현하였으나, 보..
1. Intro 일하다보면 참 통신 구현할 곳이 많음. 요즘 만드는 앱들 보면 뭘 하든 통신이 안들어가는 경우가 없기 때문임. 기존 레거시 방식 같은 경우 직관적이긴 하나 코드가 너무 길어지고 단순 노가다를 하는 감이 없지 않아 있음. 이걸 좀 어떻게 줄이는 법이 없을까하고 석달즘 전에 열심히 찾아본 결과 Retrofit2님을 영접했음. 기존 레거시 방식의 httpClient와 비교했을 때의 장단점은 아래와 같음. *장점1. REST 뿐만 아니라 파일 업로드, 다운로드 등 모든 서버콜에 대해 짧고 간결한 코드로 대응이 가능하다.2. okhttp 기반이라 심지어 더 빨라짐.3. JSON파싱을 gson파서가 알아서 해줘서 코드가 더욱 더 줄어듬.4. 콜백은 메인 쓰레드에서 돌고 통신부는 알아서 쓰레드에서 돌..
일하다보니 selector쓸 일이 은근히(사실 졸라) 많음. 디자이너가 모든 버튼류 이미지를 두 가지를 주기 때문임. 이게 버튼을 단순히 눌렀다 땟을 때를 위한 경우도 있고, 탭 버튼 아이콘 같은 경우는 계속 버튼이 눌려 있어야해서 그럼. ex) btn_send.png, btn_send_dw.png 이걸 일일히 코드로 할 수는 없는 노릇이어서 selector를 만들어야하는데 이게 또 보통 귀찮은게 아님. 여기서 그림 이름 바꾸고, 단순히 state_selected(계속 눌려있어야 하는 경우)냐 혹은 state_pressed(단순 클릭 시 이벤트)냐만 정해주면 됨. 문제는 이런게 화면당 3~4개씩 들어가고 9패치까지 들어가면 그냥 selector만드는 것도 보통 노가다가 아님. 그래서 c#으로 select..
15. 목적- 음악 스트리밍이 가능하게 한다. * How?두 가지 방법 정도를 생각하였다. 1. 파일을 전부 다운로드 한 후, 안드로이드의 파일 시스템에서 파일을 찾아서 재생한다.2. MediaPlayer 객체를 활용하여 서버의 url로 파일을 재생한다. 처음에는 조사가 부족하여 1의 방법으로 구현하였으나, 보다 클라이언트 소스가 간결한 2번을 찾게되었다. 본 포스트에서는 2번의 방법으로 구현한다. 16-1. 서버(Spring boot) 구현- 서버가 음악 파일에 대한 적절한 url을 제공할 필요가 있다. - 따라서 기존의 RequestController에 아래와 같은 메소드를 추가한다.* RequestController.java - 동작 원리는 무척 단순하다. 요청 받은 파일이 존재하면 파일을 스트림에..
11. 목적-클라이언트에서 서버 디렉토리의 하위 디렉토리로 자유롭게 이동이 가능하게 만든다. 12. 안드로이드 구현-서버는 저번 포스트에서 이미 여기까지 구현이 되어 있다. 더 이상 건드릴 필요가 없음.-사실 저번 포스트에 거즘 구현이 마쳐져 있다. 이제 안드로이드의 RecyclerView에서 각 요소를 클릭했을 때의 클릭이벤트를 구현만 하만 하면 된다. *클릭 이벤트 구현 (Steps)(1) MainListAdapter.java에 클릭 처리용 이너 클래스인 인터페이스를 하나 만든다.(2) MainListAdapter 클래스가 이 인터페이스형의 객체(굳이 말하면 이 인터페이스를 상속 받은 클래스의 인스턴스)를 필드로 갖고, 이를 생성자에서 받아오도록 한다.(3) MainActivity.java에 위의 인..
* 저번 포스트에 이어서.. 6. 목적* 저번에 서버와 클라이언트간의 통신이 잘 됨을 확인하였으므로, 이번엔 서버의 특정 디렉토리에서 파일 목록을 불러와서 클라이언트에서 확인 할 수 있도록 해봄.(1) 서버- 디렉토리에 대한 요청이 오면, 이를 처리하여 안드로이드에 돌려줄 수 있어야 한다.- 서버는 디렉토리의 내용물들이 파일인지(.mp3 파일만을 확인하고 나머지는 버린다), 디렉토리인지 확인하고, 이를 클라이언트도 구분할 수 있게 해줘야한다. (2) 클라이언트(안드로이드)- 서버에 특정 디렉토리, 혹은 그 디렉토리의 하위 디렉토리의 내용물에 대해서 정보를 요청하고, 이를 RecyclerView를 통해 화면에 뿌려줄 수 있다. 7-1. 서버(Spring Boot) 구현 요청 받은 디렉토리 밑의 파일들의 정..
0. 왜 이걸 하는가. (1) 버스 타고 가다가 급 듣고 싶은 음악이 있는데 폰에는 없고 pc에만 있다는 것을 깨닫고 화가난 경험이 있으므로. 1. 기능 구상*서버 : (1) 지정된 디렉토리와 하위 디렉토리의 .mp3 파일의 리스트를 보여줄 수 있다.(2) 지정된 디렉토리와 하위 디렉토리의 .mp3 파일의 다운로드 요청을 처리해줄 수 있다. *안드로이드 (클라이언트) :(1) 지정된 서버로부터 탐색 가능한 디렉토리와 .mp3 파일을 http 리퀘스트로 받아올 수 있다.(2) 지정된 서버로부터 해당 파일을 다운로드 받거나, 스트리밍 할 수 있다. 2. 도구 및 필수 사항*서버 : Spring Boot Application을 통해 간단하게 구현한다. 반드시 Tomcat이 깔려 있어야하고 함. IDE : ST..