티스토리 뷰

 USB기기를 제어하는 경우 USB Permission 획득을 처리하는 것이 그다지 어려운 것은 아니다. 하지만 한번에 다량(2개 이상)의 멀티 USB Device를 제어하는 경우가 발생하면 이것이 생각보다 쉬운 일이 아니다.


 원론적인 부분을 먼저 이야기하면 일단 USB Permission을 획득하기에 앞서 USB연결에 대한 "android.hardware.usb.action.USB_DEVICE_ATTACHED" 액션을 처리하는 것이 우선이다. 그리고 이 액션은 Receiver, Service 등에서 직접적으로 처리하면 USB Permission에 대한 권한을 시스템기본값으로 저장하여 동일한 기기가 연결될 때 다시 Permission을 획득하라는 창이 뜨는 것을 방지할 수 있는 뛰어난(?) 기능을 사용할 수 없다.


 이유는 왜인지 잘 모르겠지만 "android.hardware.usb.action.USB_DEVICE_ATTACHED" 해당 액션은 Activity를 통하여(저 액티비티는 화면구성요소 layout을 포함하지 않은 단순히 액션처리만을 위한 엑티비티이다.) 단순히 브로드캐스팅을 위한 엑티비티가 필요하다. 이유는 Activity에서만 Permission을 기본값으로 저장하여 사용하는 기능이 동작하기 때문이다.


 또 하나 USB는 기기를 연결하고 연결이 해제되고 다시 연결될 때 연결된 기기의 ID값(/dev/usb/ 아래 생성되는 링크)가 항상 변화한다. 1~127까지 변화한다. 이 변화를 Receiver와 Service에서는 기본값으로 저장해놓아도 이 ID값이 변경되면 다시 Permission을 획득하라는 창이 뜬다. 하지만 Activity에서 획득하면 이러한 경우가 없다라는 것이 정말 큰 특징 중 하나이다.


 개발자 입장에서야 그거 한번 누르는 것이 대수냐라고 생각하고 항상 연결된 기기에서 그거 한번 누르는게 뭐 어떠냐라고 생각할지모르지만 필드에서는 무슨일이 발생할지 모르니 저런 하드웨어 연결과 관련된 부분은 최대한 심플하고 한번의 설정으로 유지되는 것이 좋다는 것이 본인 생각이다.


 누구에게는 소소한 팁으로 누구에게는 중요한 문제를 해결하는 데 도움이 되었으면 한다.


댓글
  • 프로필사진 지난 번에 댓글 달다..궁금한 점이 생겨서 다시 여쭤보고 싶은게 있는데요.
    예제로 android usb host 통신 앱을 만들고 있는데..앱을 먼저 실행하고 usb를 꽂으면 usb_device_attached 이 부분이 안걸리더라구요.혹시 위에서 설명하신 것과 이것이 상관이 있는건가요? onCreate에서 퍼미션을 묻는건 괜찮은데(usb먼저끼고 앱실행) 앱실행후 중간에 usb를 끼면 장착되었다는 인식은 안되고 해제되는것만 인식이 되서 권한설정에 애로사항이 생겼습니다..ㅠㅠ
    혹시 해결하셨다면 작은 힌트라도 알려주실 수있는지요?
    2014.01.23 20:10
  • 프로필사진 Favicon of https://www.dante2k.com BlogIcon Dante2k™ 음... Receiver에 IntentFilter 항목을 잘 정의하고 AndroidManifest.xml 에 제대로 정의되어 있다면 정상적으로 작동해야 하는 데..
    안드로이드 OS수준에서 접속하는 해당 기기의 드라이버(?)라고 해야하는지.. 그게 안되어 있으면 그 USB Device를 아무리 붙여봐도 USB_DEVICE_ATTACHED 액션이 발생하지 않습니다.
    이건 안드로이드 OS 기기의 제조사에 문의해 보셔야 할 내용인 듯 합니다.
    2014.01.24 09:30 신고
  • 프로필사진 댓글 감사합니다.
    현재 테스트하고 있는 기종은 갤럭시S2 ,안드로이드 버전은 4.0.4입니다. android usb host 원문을 읽어보니 3.1 이상에선 지원가능하다 해서 가능하리라 생각했었거든요..
    onCreate할 때와는 다르게, 앱 실행 도중에 usb를 끼면 detached밖에 인식이 안되네요.
    devicefilter에 usb vendorid/productid 다 설정했고, manifest.xml 인텐트필터에 attached,detached 모두 액션값을 주었습니다. detahced가 인식되는걸 보면 attached 선언에 문제는 없어보이는데 연결을 감지 못하네요. dettached가 나오는걸 봐선 attached가 되긴 되었다는건데, if문에서 연결될 때 기기 액세스 권한(permission)창이 팝업되는 것이 목표입니다.
    일단 onCreate에서 mUsbManager.requestPermission(device, mPermissionIntent); 이런식으로 선언해서 usb꽂음->앱실행때엔 onCreate부터 시작하니까 창이 뜨는데.. 중간은 도저히 안되네요..ㅠ..
    안드로이드 usb 통신을 하려면 권한 설정을 해야하는데, onCreate말고 앱부터 실행하고 usb를 장착하면 감지가 안되서 권한획득에 문제가 있더군요..조언 감사드립니다.
    2014.01.24 09:45
  • 프로필사진 Favicon of https://www.dante2k.com BlogIcon Dante2k™ 음....
    앱화면으로 사용하는 엑티비티와 USB를 감지하는 엑티비티를 분리하지 않으시고 동일한 엑티비티 내에서 처리하신다는 의미로 보이는군요.
    저같은 경우는 앱의 엑티비티와 USB감지를 처리하는 리시버를 androidmanifest.xml 에 정의하고 usb가 감지되면 리시버의 onReceive() 메소드로 전달되는 intent 정보를 usb 접속을 위한 엑티비티로 던져줍니다.
    앱화면과 usb 감지부분을 분리하시고 위에 제가 얘기한대로 처리하시면 퍼미션 획득등도 적절히 처리가능할 겁니다.

    아 하나 더 제가 usb 권한 획득과 관련해서 초반에 엑티비티가 아닌 Service에서 백그라운드로 획득하게 만들었었는데요. 이렇게 하면 한번 접속했던 기기를 퍼미션 획득 다이얼로그에서 퍼미션 저장을 해도 항상 퍼미션에 관한 다이얼로그가 계속 뜹니다.;;;
    2014.01.26 07:21 신고
  • 프로필사진 누노 usb attached, detached 모두 다 잘 됩니다. 그런데 usb 가 연결되면 usb 내의 파일을 자동으로 복사해오는걸 구현하려고 하는데 usb 경로를 어떻게 구해야
    하는지 모르겠습니다. 무슨 방법이 없을까요..??
    2020.12.08 11:17
댓글쓰기 폼