본문 바로가기
안드로이드

[Android] Call requires API level 26 오류 해결: 안드로이드 api 26 미만 버전에서 java.time 패키지 사용하여 날짜 비교하기(LocalDate)

by 책 읽는 개발자_테드 2021. 1. 31.
반응형

 

자바 7 이전까지는 Date와 Calendar클래스를 이용해서 날짜와 시간 정보를 얻을 수 있었다. 하지만 해당 클래스 들은 여러 문제점(불변 객체가 아니고 직관적이지 않은 사용법 등)이 있어 자바 8부터 java.time 패키지 등장했고, 이를 통해 날짜와 시간을 조작할 수 있게 되었다.

 

(java.time 패키지의 사용법은 다음 링크에서 사용할 수 있습니다. scshim.tistory.com/251)

 

안드로이드에 java.time 패키지 적용 중 직면한 에러

 

그런데 해당 패키지에서 LocalDate를  통해 안드로이드에서 날짜의 차이를 알아내는 코드를 작성 중 다음과 같은 오류를 마주했다.

 

Error: Call requires API level 26

 

java.time 패키지를 사용하려고 했지만, 안드로이드 API 26 버전(Android 8.0 오레오) 이상부터 사용이 가능해서 발생한 오류였다. 현재 개발 중인 프로젝트는 안드로이드 API 24 버전(Android 7.0 누가)까지도 지원을 해야하기 때문에 이를 해결할 방법이 필요했다.

 

ThreeTen Android Backport 사용하여 문제해결

안드로이드 API 26 버전 이하에서도 java.time 패키지를 사용하기 위한 'ThreeTen' 백포트가 존재했고, 이것을 프로젝트에 추가하여 문제를 해결할 수 있었다.

 

* 백포팅은 최신 버전의 소프트웨어의 일부를 가져와 동일한 소프트웨어의 이전 버전으로 포팅하는 작업입니다.

 

'ThreeTen' 백포트는 다음 링크에서 확인할 수 있다. github.com/JakeWharton/ThreeTenABP

이제 실제로 안드로이드 프로젝트에 추가하고, 날짜를 비교하는 코드를 작성해보자.

 

1. 제일 먼저 build.gradle에 아래 코드를 추가하고 추가하여 'ThreeTen' 의존성을 다운로드 한다.

 

dependencies {
implementation 'com.jakewharton.threetenabp:threetenabp:1.3.0'
}

 

2. 클래스 상단에 아래와 같이 원하는 java.time 패키지의 클래스들을 추가한다. 일반적인 자바 프로젝트에서는 java.time.xxx로 Import를 하지면 'ThreeTen' 백포트를 사용하려면 org.threeten.bp.xxx를 import 하는 것에 유의하자. 여기서는 날짜 비교를 위해 LocalDate, ChronoUnit 클래스를 추가했다.

 

import org.threeten.bp.LocalDate;
import org.threeten.bp.temporal.ChronoUnit;

public class ExamActivity extends AppCompatActivity {
}

 

3. 'ThreeTen' 백포트 사용을 원하는 Activity의 onCreate 메소드 부분에 다음 코드를 추가한다. 

 

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

AndroidThreeTen.init(this); 

}

 

이 부분을 생략하면 다음 오류 발생 하므로 주의하자!

 

No time-zone data files registered

 

4. 마지막으로 다음과 같이 LocalDate, ChronoUnit를 사용하여  날짜를 비교하는 코드를 작성하자.

 

LocalDate rsrvDate = LocalDate.of(2021,01,31);
LocalDate now = LocalDate.now(); //2021년 01월 28일에 코드 실행함.

long remainDay = ChronoUnit.DAYS.between(now, rsrvDate);
System.out.println(remainDay);

 

위 코드의 결과

반응형

댓글