현재 다루는 코드에서는 화면 상으로 Android device 와 연결된 특정 기기의 화면을 실시간으로 투사해야 한다. 

이런 경우 SurfaceView 를 활용한다. 

 

일단 공식문서에서 어떻게 설명하고 있는지를 봐보자 

 

Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen

 

The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes.

 

음... 뇌가 아파오는 설명이다.

한국 블로그들을 구글링한 결과 다음과 같은 설명들을 얻었다. 

 

- SurfaceView는 view를 상속 

- 기존의  view 는 모두 화면 관련 처리를 ui 스레드에서 처리 가능 

- 하지만 일부 동영상 등 무거운 작업의 경우 ANR이 생길 수도 있음 

- 따라서 이런 때 SurfaceView를 사용. 별도의 백그라운드에서 동작하여 빠른 뷰 업데이트가 가능하다고 한다. 

 

어떻게 이런 방식이 가능하냐면 

기존 처럼 그리는 것을 시스템에 맡기지 않고, 스레드를 통해 강제로 원하는 시점에 바로 그리는 것이라고 한다. 

 

 

 

그려지는 원리는 다음과 같다. SurfaceView 자신 만큼의 부분을 Window에서 뚫어서 

최종적으로는 Window에 올려진 View 위에서 SurfaceView와 View가 같이 보이는 방식이다 (Blended). 

 

 

 

SurfaceView를 사용할 경우 다음 4가지의 메서드를 오버라이드 해야 한다. 

1. public void onDraw (Canvas canvas)
2. public void surfaceChanged() : 뷰 변경시 호출 
3. public void surfaceCreated() : 뷰 생성시 호출 
4. public void surfaceDestroyed() : 뷰 종료시 호출 

 

 

private final SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
};

 

이런식으로 오버라이드 해서 적절한 처리를 해주면 된다. 

 

-------------------

참고한 사이트 

 

https://developer.android.com/reference/android/view/SurfaceView

 

SurfaceView  |  Android Developers

 

developer.android.com

https://happysuzy.tistory.com/180

 

SurfaceView

개념 anroid.View.view android.view.surfaceView 로 view를 상속받고있다 -그래픽 처리가 빠른 View -일반적인 경우에는 view를 통해서 draw()를 그리는것과 별 차이가 없다. 그럼 왜 필요하냐? 안드로이드의 모든

happysuzy.tistory.com

https://blog.naver.com/muri1004/221054311714

 

[Android] SurfaceView 개념 및 예제

SurfaceView 란? SurfaceView는 View를 상속받는 클래스이다. 일반 View는 onDraw 메소드를 시스템...

blog.naver.com

https://injunech.tistory.com/326

현재 프로젝트에는 사운드를 다뤄야 할 일이 굉장히 많다. 그래서 이 AudioAttribute와 접할 일이 많다. 

 

먼저 공식 문서의 정의를 봐보자 (https://source.android.com/docs/core/audio/attributes)

 

Audio players support attributes that define how the audio system handles routing, volume, and focus decisions for the specified source. 

 

대충 해석을 해보면 AudioAttribute는 볼륨, 포커스 결정, 라우팅 (아마 출력 경로를 의미하는게 아닌가 싶다. 이어폰, 스피커 등등 .. ) 등을 지정하는데 쓰이는 속성 값이라고 보면 될 듯 하다. 

 

 

 

AudioAttribute가 어떤 값들을 가지고 있는지 자세히 알아보자. 공식문서에서 관련된 것들을 가져왔다. 

안드로이드는 개발자가 설정한 이러한 값들을 기반으로 어떤 식으로 사운드 처리를 해야하는지 판단하는 듯 하다. 

 

다음은 Usage에 관련한 프로퍼티다 

 

  • USAGE_UNKNOWN 
  • USAGE_MEDIA 
  • USAGE_VOICE_COMMUNICATION 
  • USAGE_VOICE_COMMUNICATION_SIGNALLING 
  • USAGE_ALARM
  • USAGE_NOTIFICATION 
  • USAGE_NOTIFICATION_TELEPHONY_RINGTONE --> 
  • USAGE_NOTIFICATION_COMMUNICATION_REQUEST
  • USAGE_NOTIFICATION_COMMUNICATION_INSTANT
  • USAGE_NOTIFICATION_COMMUNICATION_DELAYED
  • USAGE_NOTIFICATION_EVENT
  • USAGE_ASSISTANCE_ACCESSIBILITY
  • USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
  • USAGE_ASSISTANCE_SONIFICATION
  • USAGE_GAME
  • USAGE_VIRTUAL_SOURCE
  • USAGE_ASSISTANT

 

그리고 다음은 Content Type에 관련한 것들이다. 

 

  • CONTENT_TYPE_UNKNOWN(기본)
  • CONTENT_TYPE_MOVIE
  • CONTENT_TYPE_MUSIC
  • CONTENT_TYPE_SONIFICATION
  • CONTENT_TYPE_SPEECH

 

실제 Attribute는 다음과 같이 만들어서 쓰면 된다. 음악을 재생하는 경우를 코드로 짜 보았다. 

 

usage = AudioAttributes.USAGE_MEDIA;
cType = AudioAttributes.CONTENT_TYPE_MUSIC;

AudioAttributes attr = new AudioAttributes.Builder()
    .setUsage(usage)
    .setContentType(cType)
    .build();

'Android' 카테고리의 다른 글

Android 퍼미션 CHANGE_CONFIGURATION  (0) 2023.10.11

현재 진행중인 프로젝트는 오디오 관련 처리를 하는 일이 많은데 

이 'duck' 이란 용어가 자주 등장한다. 

 

duck의 사전적 의미 (오리 말고!) 는 다음과 같다. 

 

to move your head or the top part of your body quickly down, especially to avoid being hit

 

 

그리고 사운드에 관해서 ducked라는 용어가 나오는 맥락을 보니 다음과 같다. https://crumplepop.com/what-is-audio-ducking-and-how-do-you-use-it/

 

Audio ducking is a process whereby sound is “ducked” down when another sound goes beyond a particular threshold. The volume of the audio track which is the background track is temporarily lowered to allow the main track to take prominence.

 

해석하자면, 오디오 더킹은 한 소리가 다른 소리에 의해 잠시 줄어들게 하는 기술을 의미하는듯 하다.

 

예를들면 네비게이션으로 음악을 틀고 있는데, 중요한 주행 관련 알림음이 날아온다고 가정하자. 

음악 볼륨이 커서 중요 알림음이 묻히게 된다면 운전자에게 중요한 정보를 전달할 수 없게 된다. 

 

따라서 이 경우엔 중요 알림음이 들리도록 음악 볼륨을 낮춰야 하는 것이다. 

이런 맥락에서 ducking을 이해하면 될 듯하다. 

+ Recent posts