일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- rxjava hot observable
- 서비스 vs 쓰레드
- 안드로이드 라이선스
- 스택 자바 코드
- 안드로이드 레트로핏 사용법
- 2022 플러터 설치
- 객체
- 안드로이드 유닛 테스트 예시
- ANR이란
- 안드로이드 유닛테스트란
- 안드로이드 레트로핏 crud
- 멤버변수
- 서비스 쓰레드 차이
- 2022 플러터 안드로이드 스튜디오
- ar vr 차이
- jvm이란
- 스택 큐 차이
- 안드로이드 유닛 테스트
- android retrofit login
- android ar 개발
- rxjava disposable
- Rxjava Observable
- 큐 자바 코드
- 클래스
- 자바 다형성
- 플러터 설치 2022
- 안드로이드 os 구조
- rxjava cold observable
- 안드로이드 라이선스 종류
- jvm 작동 원리
- Today
- Total
나만을 위한 블로그
[Android] Matisse 라이브러리 사용 중 NoSuchMethodError: No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest 에러 해결 본문
[Android] Matisse 라이브러리 사용 중 NoSuchMethodError: No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest 에러 해결
참깨빵위에참깨빵_ 2020. 3. 25. 01:15참고한 사이트 : https://github.com/zhihu/Matisse/issues/316
Matisse 라이브러리를 쓰면 Glide 등의 이미지 라이브러리도 같이 쓴다. 이미지를 이미지뷰에 박을 때 필요하다.
그런데 Matisse 라이브러리의 함수 중 imageEngine()이란 함수가 있다. 여기에는 글라이드 엔진이라는 클래스를 new 키워드와 함께 인자로 넣어줘야 한다.
그런데 여기에 new GlideEngine()이라고 쓰면 안된다. 버튼을 눌러서 Matisse 라이브러리를 실행하면 앱이 죽어버리면서 이 글의 제목과 같은 문장이 들어간 오류를 토해낸다. 너무 길어서 첫 부분만 제목에 썼다.
무슨 에러인지 구글에 검색하니 한 중국인이 이런 답글을 달았다.
- 이 오류는 글라이드 버전의 충돌로 인해 발생합니다 Matisse는 글라이드 : 3.7.0에 의존하고 글라이드 : 4.x를 사용합니다. 물론 다른 타사 라이브러리는 글라이드에 의존 할 수도 있습니다 : 4.x. 글라이드 버전을 통합하는 것이 좋습니다. 또는 비슷한 프레임 워크 EasyPhotos를 사용하여 이미지로드 라이브러리를 인터페이스 형태로 바인딩하므로 비슷한 문제가 발생하지 않습니다. 이 문제 .imageEngine (새로운 MyGlideEngine ()) Custom GlideEngine은 최신 버전의 글라이드 라이브러리로 대체 될 수 있습니다.
이런 말과 함께 장문의 코드를 써놨다. 이 코드는 대충 적당히 클래스 파일로 만들어준다.
난 Glide4Engine.java라는 클래스 파일을 하나 만들고 아래의 내용을 넣어줬다.
@Override
public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
RequestOptions requestOptions = new RequestOptions()
.override(resize, resize)
.centerCrop()
.placeholder(placeholder);
Glide.with(context)
.asBitmap()
.load(uri)
.apply(requestOptions)
.into(imageView);
}
@Override
public void loadAnimatedGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
Uri uri) {
RequestOptions requestOptions = new RequestOptions()
.override(resize, resize)
.centerCrop()
.placeholder(placeholder);
Glide.with(context)
.asBitmap()
.load(uri)
.apply(requestOptions)
.into(imageView);
}
@Override
public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
RequestOptions requestOptions = new RequestOptions()
.override(resizeX, resizeY)
.priority(Priority.HIGH)
.centerCrop();
Glide.with(context)
.load(uri)
.apply(requestOptions)
.into(imageView);
}
@Override
public void loadAnimatedGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
RequestOptions requestOptions = new RequestOptions()
.override(resizeX, resizeY)
.priority(Priority.HIGH)
.centerCrop();
Glide.with(context)
.asGif()
.load(uri)
.apply(requestOptions)
.into(imageView);
}
@Override
public boolean supportAnimatedGif() {
return true;
}
구글링하다 보면 RequestOptions 부분이 없고 Glide 관련 함수들만 있는 재정의된 함수들만 있는 클래스를 볼 수 있는데, 두 버전을 각각 실행해보니 둘 간의 차이는 딱히 느껴지지 않았다.
모두 갤러리에서 이미지 혹은 동영상들을 제대로 가져오는 걸 확인했다.
아무튼 저 내용대로 선언했다면 Matisse.from(this) 이후에 이 부분을 하나 넣어주면 된다.
.imageEngine(new Glide4Engine())
그 다음 onActivityResult()와 Glide를 같이 활용해서 이미지뷰에 갤러리의 이미지를 뿌려줄 수 있다.
참고로 Matisse를 쓰면 이미지와 동영상은 동시에 선택할 수 없다.