마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

다음 로그를 바탕으로 Device단의 이벤트를 캐치할 수 있을까요?

0 추천
08-05 10:59:35.740: D/AudioDeviceManagerObserver(1874): name: AUDIO_HDMI, state: 0, type: 1
08-05 10:59:35.740: D/StatusBar.DisplayController(2115): RECEIVE INETNE-----------ACTION_HDMISTATUS_CHANGED
08-05 10:59:35.740: D/StatusBar.DisplayController(2115): onHdmiPlugChanged and mIsStandby is = false
08-05 10:59:35.740: D/StatusBar.DisplayController(2115): hdmiplug and hdmiplug is = 0

 

안드로이드 단말기에 외부장치를 연결하거나 해제할때의 이벤트를 캐치하려 합니다.

연결 여부에 따라 ACTION_HDMISTATUS_CHANGED 이 발생하며 각종 state를 출력해주는데,

이 상태 값을 App단에서 받아올 수 있을까요?

외부장치 업체(중간업체)에 문의를 하니 로그에 찍히는 것이 없는지 확인해보라고 하네요.

이런식으로 개발을 해보는건 처음이고 난감한 상황이라 참.. 해보는데까지 해보고 요청하려합니다.

 
Android 4.1+ 부터 로그 전체를 받아올 수 있다고 하여 적용은 해봤는데,  공백으로만 찍히며 이 방법은 절대적으로 비효율적이라 생각합니다.

 

 

개발자초심 (21,220 포인트) 님이 2015년 8월 5일 질문

1개의 답변

0 추천

인텐트 필터 (Intent Filter) 에 대해 공부해보세요...

실제 안드로이드 코드에서도 intent filter를 통해 감지하니.. 비슷하게 구현 해 주시면 됩니다. 

익명사용자 님이 2015년 8월 5일 답변
2015년 8월 5일 수정
답변 감사합니다.
Intent Filter를 통하여 여러 리시버 이벤트를 받아오고 있습니다.

허나  ACTION_HDMISTATUS_CHANGED 라는 것은 안드로이드 자체 지원 API가 아니기에 상수로 설정할 수가 없습니다.

application Named을 보니 "com.android.systemui" 으로 찍힙니다만, 로그만으로 가능한가 싶어서 조언을 구합니다.
첨부한 안드로이드 소스  링크 보신 건가요?
SDK에서만 사용하는 private 값이라 단말에 따라 HDMI상태가 바끼는 상황에서도 발생하지 않을 수는 있지만.  실제 안드로이드 코드에서도 이 값으로 감지를 하고 있으며, broadcast 로 보내는 intent라 발생했다면, 잡혀야 정상입니다.

ACTION_HDMISTATUS_CHANGED 의 경우  Intent.java 파일에 아래와 같이 선언 되어 있습니다.
제조사에서 선언한 값을  변경 했으면, 필터링이 안되겠지만.  
보통은 이런 값은  수정을 안하니.. 이 값을 직접 입력하는 방식으로 구현 하시면 필터링이 될 겁니다.

 public static final String ACTION_HDMISTATUS_CHANGED = "android.intent.action.HDMISTATUS_CHANGED";
답변 감사합니다. 소스단으로 작성하니 이벤트가 받아와지네요.
하지만 CHANGED 만 받아올뿐 그 안에 connect 인지, disconnect 인지에 대한 값을 판별할 수 있는게 없는것 같습니다.

첨언해주신 링크를 보면
intent.getIntExtra(DisplayManager.EXTRA_HDMISTATUS, 0); 의 값에 따라 판별을 하는데, 앱단에서 DisplayManager 를 접근할 수 있는 방법이 있을까요?
api 레벨을 적정수준으로 올려도, DISPLAY_CATEGORY_PRESENTATION 옵션만 사용할 수가 있네요.
DisplayManager에 굳이 접근할 필요가 없는데요..

DisplayManager.java 에
  public static final String EXTRA_HDMISTATUS = "hdmistatus";
로 선언되어 있으니.

intent.getIntExtra("hdmistatus", 0); 로 뽑아 사용하시면 됩니다.
구글 코드에 나오듯 1이면 연결되는 것이고 0이면 끊긴겁니다.

다른 정보도 이와  비슷한 방식으로 구하실 수 있구요..
답변 감사합니다. 안드로이드 레퍼런스를 저도 참고하였는데,
public static final String EXTRA_HDMISTATUS = "hdmistatus";
라는 부분을 아직도 못찾고 있네요.
말씀해주신 방법으로 접근하니 hdmi 이벤트 체크를 할 수 있었습니다.

혹시 제가 보고 있는 레퍼런스와 다른 문서를 보고 계신건지 추가 조언을 구할 수 있을까요?
http://developer.android.com/reference/android/hardware/display/DisplayManager.html
https://android.googlesource.com/platform/frameworks/base/+/0e2d281/core/java/android/hardware/display/DisplayManager.java

큰 도움 감사합니다.
해결  축하드립니다.

private 값이라 developer 페이지 java doc에 나오지 않는 듯 하구요

안드로이드 소스 링크를 보니 2013년 5월자 버젼이던데 해당버젼에는 없는 듯 하네요..

구글에서 EXTRA_HDMISTATUS 로 검색해도 나오긴 합니다만...
아래가 제가 찾은 링크입니다.

https://github.com/allwinner-ics/platform_frameworks_base/search?utf8=%E2%9C%93&q=EXTRA_HDMISTATUS
감사합니다. 큰 도움 되었습니다.
...