본문 바로가기

[안드로이드 | ExoPlayer] EventListener를 활용해 여러개의 동영상 연달아 재생하기 ExoPlayer를 동영상 재생에 쓰던 중에 여러개의 영상을 연달아 보여줘야 하는 요구사항이 생겼다. 이를 위해 일전에 에셋을 리스트 형태로 만들어 다른 용도로 썼던 것을 떠올려 구현을 해보기로 했다. 1. ExoPlayer Initialize 2. 비디오 에셋 resourceList 설정 3. ProgressiveMediaSource ArrayList에 차례대로 resourceList를 로딩해 add 4. Player.EventListener Initialize 5. ExoPlayer에 listener add 6. ExoPlayer.setShutterBackgroundColor(Color.TRANSPARENT) 7. 영상을 차례대로 재생하는 플레이어 감상 - 기본 설정 ..
[안드로이드] SDK 버전에 구애받지 않고 별도의 클래스에서 이미지 asset 참조해 적용하기 작업을 하면서 Activity가 아닌 클래스에서 이미지 asset을 참조해 이를 이미지뷰에 적용하고자 하였는데, 리소스 혹은 context로부터 getDrawable을 하면 SDK limit이 걸리는 걸 확인할 수 있었다. (SDK 버전 21 아래에서는 먹히지 않는다는 코드) 대안을 찾고자 검색을 하였고 ContextComnpat을 통해 SDK 버전에 구애받지 않으면서 Activity가 아닌 별도의 클래스에서 이미지 asset을 참조할 수 있었다. ContextCompat.getDrawable(getContext(), R.drawable.참조할Drawable) 이를 이미지뷰에 넣고자 할 땐 myImageView.setImageDrawable(상단의코드) https://stackoverflow..
[안드로이드 | 코틀린] 사용자 정의 커스텀 달력 만들고 ViewPager에 접목하기 커스텀 달력 구현을 위해 자료를 찾던 중 Medium에서 참조할만한 레퍼런스를 찾았으나 자바코드로 구성되어 있는것은 물론 일부 생략된 부분들이 있어 구현에 조금 어려움이 있었다. 우여곡절 끝에 기본구성을 마치고 구성에 필요했던 과정과 준비물들을 정리해두고자 한다. 준비물 1. 뷰로 선언할 캘린더의 xml Layout (calendar_layout) 2. 달력의 일자에 적용할 xml Layout (calendar_day_layout) 3. LinearLayout을 확장해 만든 커스텀 캘린더 클래스 4. 캘린더의 일자 구성, 색상변경등을 수행할 캘린더 어댑터 클래스 구성 방법 1. 뷰로 선언할 캘린더의 xml Layout (calendar_layout) 만들기 캘린더의 전체 틀로써 크게 LinearLayou..
[안드로이드 | MpAndroidChart] 바 그래프의 하단 영역이 생길 때의 대처법 그래프를 활용한 뷰를 만들면서 실제 데이터를 적용하기 이전에 랜덤 값으로 바 그래프 데이터를 만들어 보여주고 있었는데, 값이 바뀔 때마다 이상하게 바의 하단영역이 비는 현상이 생겼다. 이를 해결하기 위해 다양한 설정값을 먹여보았으나 잘 듣지 않았고, 얼마간의 시행착오를 거쳤는데 정답은 그래프의 min max 값을 정하는데에 있었다. 아래와 같은 설정 값을 먹인 뒤로 해당 현상은 사라지게 되었다. 차트.axisLeft.axisMinimum = 0f 이어 추가로 바 그래프를 설정한 뷰의 영역에 꽉 채우고 싶어서 자료를 찾아보았는데 잘 나오지 않았고 이윽고 스택 오버플로에 직접 질문을 하여 해답을 구할 수 있었다. 차트.setViewPortOffsets(0f, 0f, 0f, 0f) 다만 현재 문제점은 차트를 ..
[안드로이드 | 코틀린] 데이터바인딩을 사용할 때 Fragment 내의 View 좌표 가져오기 이번에 신규로 구현하는 페이지에서 유저의 터치에 따라 화면 내의 커서를 특정 위치로 보내야 하는 요구사항이 있었다. 터치를 받는 곳은 별도의 뷰에서 들어오는 것이었기에, 터치는 터치대로 Listen해 마찬가지로 별도의 뷰로 되어있는 인디케이터를 움직여야 했다. 이를 해결하기 위해 커서가 가장 좌측으로, 그리고 우측으로 최대한 움직였을 때의 위치를 더미 View를 사용해 지정하였고, 둘간의 좌표 차이를 활용해 커서를 수평이동 시키기로 했다. 서론은 이정도로 마치고 데이터바인딩된 Fragmet 레이아웃으로부터 특정 뷰의 좌표를 가져오기 위한 방법은 아래와 같다. ... val binding = DataBindingUtil.inflate(inflater, R,layout.fragment_layout, cont..
[안드로이드] ExoPlayer2 오류 : invoke-customs are only supported starting with Android O) invoke-customs are only supported starting with Android O) Defaut interface methods are only supported starting with Android N .. 영상 재생을 위한 ExoPlayer를 Implement하는 과정에서 위와 같은 오류가 발생했다. Stack Overflow에서 어렵지 않게 해결책을 구할 수 있었는데, 비슷한 오류를 겪은 사람들이 많았던 듯. 아래의 코드를 app레벨의 gradle 파일에 추가하자. android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 ..
[안드로이드] ConstraintLayout 내부에 Fragment 알맞게 배치하기 상단에는 페이지의 제목과 설정 아이콘 등을 넣을 수 있는 AppBar, 중앙에는 변경되는 Fragment들이 배치되는 FrameLayout, 하단에는 페이지 이동을 위한 BottomNavigationView가 들어가있는 크게 세 칸의 구성으로 된 레이아웃 구성을 진행중에 있었다. 여기서 문제가 하나 있었는데, 중앙에 배치되는 ConstLayout이 삐져나온다거나 꽉 차지 않아 기기간에 차이도 생기고, 디자인의 의도대로 앱이 보여지지 않는 불편한 경우가 생기는 것이었다. 이런 경우에는 ConstraintLayout의 width와 height 설정이 중요한데, 아래와 같은 과정을 통해서 본래 의도에 맞게 중간 영역에 알맞게 Fragment의 뷰가 가득 차게 구현할 수 있었다. 1. Fragment를 뿌리는 ..
[안드로이드] Exo Player에서 발생하는 java.net.MalformedURLException: unknown protocol 해결 Exo player 셋업을 마치고 player에 Uri 파일을 넘겨주는 과정에서 java.net.MalformedURLException: unknown protocol 에러가 발생하였다. player에 넘겨주고자 했던 건 프로젝트의 리소스 폴더 내 raw 폴더에 넣어둔 mp4 파일이었는데, 기타 다양하게 나와있는 Uri 생성 방법으로 해보았으나 실패하였고, 결론적으로 아래의 방식을 통해 문제를 해결할 수 있었다. val rawDataSource = RawResourceDataSource(context) rawDataSource.open(DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.sample_video))) val videoSource = Prog..