USB 내시경 뷰어 앱
광고투성이 앱 대신, USB 내시경을 꽂으면 바로 켜지고 찍고 저장만 하는 Android 뷰어를 직접 만들었습니다.
| NO. | M-03 |
|---|---|
| FIELD | 모바일 앱 |
| SCALE | 미니 |
| TOOLS | Kotlin · Android |
| DATE | 2026 |
| REPO | khw1566/USB-CAM-APP |
왜 만들었나
USB 내시경 카메라를 휴대폰에 꽂아 쓰려면 제조사가 안내하는 앱을 깔아야 했는데, 광고가 많고 필요 이상의 권한(마이크, 전체 저장소 등)을 요구했습니다. 정작 필요한 건 "꽂으면 화면이 나오고, 버튼 누르면 사진이 저장되는 것" 하나였습니다. 그래서 그 기능만 있는 앱을 직접 만들기로 했습니다.
기계 점검할 때 손 안 닿는 곳 들여다보는 용도
무엇을 만들었나
- 꽂으면 자동 실행: USB 영상 장치(UVC 클래스 14, 복합 장치 239/2)를 연결하면 앱이 바로 뜹니다.
- 실시간 미리보기: 장치가 지원하는 해상도 중 1080p 이하에서 가장 큰 크기를 고르고, 같은 크기라면 프레임이 잘 나오는 MJPEG 형식을 우선합니다.
- 촬영과 저장: 화면의 셔터 버튼이나 내시경 케이블에 달린 물리 버튼으로 찍으면
Pictures/Endoscope폴더에ENDO_날짜_시각.jpg로 저장되고, 썸네일을 누르면 갤러리에서 바로 열립니다. - 최소 권한: 카메라 권한 하나만 요청합니다. 라이브러리가 끌고 오는 마이크·외부 저장소·포그라운드 서비스 권한은 매니페스트에서 직접 제거했습니다.
어떻게 만들었나
- Android의 USB Host 기능과 UVCAndroid 라이브러리로 내시경을 일반 USB 카메라(UVC)로 다룹니다.
- 연결 → 권한 확인 → 해상도 선택 → 미리보기 → 촬영 순서를 상태 콜백(
onAttach,onDeviceOpen,onCameraOpen…)에 맞춰 나눴습니다. - 저장은 파일 경로를 직접 쓰지 않고 MediaStore를 통해 넣어서, Android 10 이상에서 저장소 권한 없이도 갤러리에 사진이 보이게 했습니다.
- 촬영 중 중복 입력을 막는 플래그, 셔터를 누를 때 화면이 번쩍이는 효과, 미리보기 중 화면이 꺼지지 않게 하는 처리 등 쓰는 사람 입장의 디테일을 챙겼습니다.
Kotlin 파일 하나(약 250줄)로 끝낸 작은 앱
결과
- 광고 없이 꽂고 → 보고 → 찍는 세 단계만 남은 내시경 뷰어를 완성했습니다(minSdk 29, Android 10 이상).
- 하드웨어(USB 장치 클래스, 영상 포맷)와 앱 권한 구조를 같이 이해해야 풀리는 문제였고, "필요한 만큼만 만든다"는 기준으로 기능과 권한을 줄였습니다.
- 기계 정비·점검 현장에서 바로 쓸 수 있는 도구를 스스로 만들어 쓴 경험입니다.