관리 메뉴

나만을 위한 블로그

[Android] Matisse 라이브러리 사용 중 NoSuchMethodError: No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest 에러 해결 본문

Android

[Android] Matisse 라이브러리 사용 중 NoSuchMethodError: No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest 에러 해결

참깨빵위에참깨빵_ 2020. 3. 25. 01:15
728x90
반응형

참고한 사이트 : https://github.com/zhihu/Matisse/issues/316

 

No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest; in class · Issue #316 · zhihu/Matisse

java.lang.NoSuchMethodError: No virtual method load(Landroid/net/Uri;)Lcom/bumptech/glide/DrawableTypeRequest; in class Lcom/bumptech/glide/RequestManager; or its super classes (declaration of '...

github.com

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를 쓰면 이미지와 동영상은 동시에 선택할 수 없다.

반응형
Comments