'com.google.android.exoplayer:exoplayer:2.8.4’에서 2.9.1로 업데이트를 하려고 했으나 찾아보니

exoplayer는 더이상 업데이트 되지않고 deprecated됐다.

공식적으로 media3를 권장하고 있다. 

 

Deprecated Changed  
SimpleExoPlayer ExoPlayer  
Player.EventListener Player.Listener  
override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) override fun onTimelineChanged(timeline: Timeline, reason: Int)  
override fun onTracksChanged(
trackGroups: TrackGroupArray?,
trackSelections: TrackSelectionArray?)
override fun onTracksChanged(tracks: Tracks)  
override fun onLoadingChanged(isLoading: Boolean) override fun onIsLoadingChanged(isLoading: Boolean)  
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) override fun onPlaybackStateChanged(playbackState: Int) //재생상태 변화 감지

onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) //재생 준비 상태 감지
두개로 분리
override fun onPlayerError(error: ExoPlaybackException?) override fun onPlayerError(error: PlaybackException)  
override fun onPositionDiscontinuity(reason: Int) override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
reason: Int)
 
override fun onSeekProcessed() onSeekStarted
onSeekCompleted
onSeekProcessed에서 onSeekStarted
onSeekCompleted 두 상태로 변경
DefaultBandwidthMeter DefaultBandwidthMeter.Builder(exoPlayerView.context).build()
또는 BandwidthMeter
TrackSelector에서 자동으로 측정하는 방식으로 변경되어 설정할 필요 없음
val videoTrackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter)
val trackSelector = DefaultTrackSelector(videoTrackSelectionFactory)
val trackSelector = DefaultTrackSelector(exoPlayerView.context) AdaptiveTrackSelection 제거
DefaultTrackSelector로 통합
ExoPlayerFactory.newSimpleInstance(exoPlayerView.context, trackSelector) ExoPlayer.Builder(context).setTrackSelector(trackSelector).build() newSimpleInstance 제거
val bandwidthMeter = DefaultBandwidthMeter()
defaultDatasourceFactory = DefaultDataSourceFactory
(context, bandwidthMeter, DefaultHttpDataSourceFactory(userAgent, bandwidthMeter))
val defaultHttpDataSourceFactory = DefaultHttpDataSource.Factory().setUserAgent(userAgent)defaultDatasourceFactory = DefaultDataSource.Factory(context, defaultHttpDataSourceFactory) DefaultDataSourceFactory
→ DefaultHttpDataSource + DefaultDataSource.Factory
prepare(mediaSource) setMediaSource(mediaSource)  
SimpleExoPlayer.VideoListener ExoPlayer.Listener  
addVideoListener addListener  
override fun onVideoSizeChanged( width: Int,
height: Int,
unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float)
override fun onVideoSizeChanged(videoSize: VideoSize) videoSize.width
videoSize.height 등으로 사용 변경
ExtractorMediaSource.Factory(DefaultHttpDataSourceFactory(userAgent)) .createMediaSource(uri) ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(MediaItem.fromUri(uri))
 
setControllerVisibilityListener { visibility -> exoPlayerView.setControllerVisibilityListener(object : PlayerView.ControllerVisibilityListener { override fun onVisibilityChanged(visibility: Int) override fun onVisibilityChanged 추가
     

 

 

 //변경 예시
 private MediaSource buildMediaSource(Uri uri) {
        String userAgent = Util.getUserAgent(context, "userAgent");
       DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory().setUserAgent(userAgent);
       // Uri를 MediaItem으로 변환
       MediaItem mediaItem = new MediaItem.Builder().setUri(uri).build();
        if (uri.getLastPathSegment().contains("mp3") || uri.getLastPathSegment().contains("mp4")) {
            return new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
        } else if (uri.getLastPathSegment().contains("m3u8")) {
            return new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
        } else {
            return new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
        }
    }

 

Exo Controller 내부 Id

  • exo_play – 플레이 버튼 (재생 버튼)
  • exo_pause – 일시 정지 버튼
  • exo_progress – 미디어 재생 진행 상태를 나타내는 SeekBar
  • exo_current_time – 현재 재생 시간을 표시하는 텍스트 뷰
  • exo_duration – 전체 재생 시간을 표시하는 텍스트 뷰
  • exo_rew – 10초 뒤로 가기 버튼
  • exo_ff – 10초 앞으로 가기 버튼
  • exo_fullscreen – 전체 화면 버튼 (있는 경우)
  • exo_back – 뒤로가기 버튼 (있는 경우)
  • exo_caption – 자막 버튼 (있는 경우)
  • exo_audio_track – 오디오 트랙 선택 버튼 (있는 경우)
  • exo_vr – VR 모드 버튼 (있는 경우)
  • exo_buffering – 버퍼링 상태를 나타내는 뷰 (로딩 애니메이션)
  • exo_skip_ad – 광고 건너뛰기 버튼 (있는 경우)
  • exo_error – 에러 표시 뷰 (있는 경우)
  • exo_controls – 전체 컨트롤러 영역
  • exo_controller – 전체 컨트롤러의 부모 레이아웃

 

 

  1. 숫자만 : ^[0-9]*$
  2. 영문자만 : ^[a-zA-Z]*$
  3. 한글만 : ^[가-힣]*$
  4. 영어 & 숫자만 : ^[a-zA-Z0-9]*$
  5. E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
  6. 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
  7. 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$
  8. 주민등록번호 : \d{6} \- [1-4]\d{6}
  9. IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

- 연도(year) 유효성 검사

fun isValidYear(year: String) : Boolean {

    //1900~1999,20xx
    val regex = "^(19[0-9][0-9]|20\\\\d{2})$".toRegex()

    return regex.matches(year)
}

 

- 월(month) 유효성 검사

fun isValidMonth(month: String) : Boolean {

    var regex = "^0[1-9]|1[0-2]|[1-9]$".toRegex()

    return regex.matches(month)
}

 

- 일(day) 유효성 검사 (2월 31일이 입력되는 문제가 있기 때문에 따로 처리 해줘야함)

fun isValidDay(day: String) : Boolean {

    var regex = "^0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9]$".toRegex()

    return regex.matches(day)
}

 

- 숫자 유효성 검사

fun isValidNumber(phonNumber: String) : Boolean {

    val regex = "^[0-9]+$".toRegex()

    return regex.matches(phonNumber)
}

 

 

- 10자리 or 11자리 유효성 검사

fun isValidPhone(phonNumber: String) : Boolean {

    val regex = "^(?:\\\\d{10}|\\\\d{11})$".toRegex()

    return regex.matches(phonNumber)
}

참조 URL
기기를 켜진 상태로 유지 | Android 개발자 | Android Developers

 

기기를 켜진 상태로 유지하기 위한 적절한 API 선택  |  Background work  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 기기를 켜진 상태로 유지하기 위한 적절한 API 선택 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사

developer.android.com

 

방법1

//화면 절전모드 해제 ---1
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

//화면 절전모드 해제 취소 ---2
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

화면 절전모드 해제를 하는 경우 해당 Activity에 있는동안은 화면이 계속 켜진다.

화면 절전모드 해제 취소를 하는 경우엔 절전모드가 해제된다.

화면이 절전이 된 상태에서 해당 코드를 실행하면 화면이 다시 밝아짐

해당 Activity가 종료되면 다시 기기설정을 따름

 

방법2

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
android:keepScreenOn="true">
        ...
    </RelativeLayout>

해당 Activity의 xml에 keepScreenOn=”true”값을 설정해 준다.

 

 

특징

이 접근 방식의 장점은 wake lock(CPU를 켜진 상태로 유지 참조)과 달리 특정 권한이 필요하지 않고 앱이 사용하지 않는 리소스를 해제할 필요 없이 사용자가 애플리케이션 간에 이동할 수 있도록 플랫폼이 올바르게 관리한다는 것입니다.

 

참고

실행 중인 애플리케이션에서 계속 화면이 켜져 있을 필요가 없다면(예를 들어, 특정 시간 동안 활동이 없을 때 화면을 타임아웃하려는 경우) FLAG_KEEP_SCREEN_ON플래그를 삭제하지 않아도 됩니다. 창 관리자는 앱이 백그라운드로 이동하거나 포그라운드로 돌아갈 때 올바른 작업을 하도록 확인합니다. 하지만, 명시적으로 플래그를 삭제하여 화면이 꺼지도록 하려면 다음과 같이 clearFlags() 를 사용합니다. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

Patterns.EMAIL_ADDRESS.matcher(inputEmail).matches()

inputEmail에 입력된 이메일 값을 넣어주면 해당 텍스트가 이메일 형식인지 아닌지 판단해서 true, false값을 내려준다.

이메일 형식인 경우 → true

이메일 형식이 아닌 경우 → false

**Pattern.matches(”정규식”,검사할 텍스트) → 정규식 검사

if (!Patterns.EMAIL_ADDRESS.matcher(binding.shippingEmail.editEmail.text).matches()){
    Toast.makeText(activity, "이메일을 바르게 입력해 주세요.",Toast.LENGTH_SHORT).show()
    return@setOnClickListener
}

 

+ Recent posts