Android WebView에서 빠진 포인트 요약

당 기사에 대해서



WebView는 성가신 존재라고 생각합니다.
무수히 있는 웹 페이지가 제대로 표시되는지가 수상하다고 느끼는 오늘 요즘.
그리고는 WebView에 한정한 이야기는 아니지만, OS버전이나 단말에 의해 일어나거나 일어나지 않는 버그.
본 기사에서는 WebView의 구현으로 개인적으로 빠진 포인트를 수시로 갱신해 나갈 것입니다.

Android 6.0에서 동영상 콘텐츠가있는 URL을 보려고하면 충돌합니다.



사건



Android 6.0에서 동영상 콘텐츠가 있는 URL을 보려고 하면 다음과 같이 충돌합니다.
07-21 22:35:26.674 4770-4770/com.example.samplewebviewapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.samplewebviewapp, PID: 4770
    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
        at com.android.webview.chromium.WebViewContentsClientAdapter.getDefaultVideoPoster(WebViewContentsClientAdapter.java:1208)
        at org.chromium.android_webview.DefaultVideoPosterRequestHandler$1.run(DefaultVideoPosterRequestHandler.java:39)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-21 22:35:26.779 4770-4811/com.example.samplewebviewapp E/eglCodecCommon: glUtilsParamSize: unknow param 0x000085b5

원인



HTML 내부에 video 태그가 있고 그 안에 poster 속성이라는 속성이 있습니다.
분명히 사용자 환경에서 사용할 수 있는 동영상이 없는 경우 표시할 이미지를 지정하는 것 같습니다.
<video> - HTML5 태그 참조

이 속성이 지정되어 있지 않은 경우, WebChromeClient#getDefaultVideoPoster 메소드가 불려집니다만, 그 반환값이 null 이기 때문에 일어나고 있었습니다.

해결책


AndroidManifest.xmlWRITE_EXTERNAL_STORAGE 를 선언하는 방법으로 해결할 수 없습니다.WebChromeClient#getDefaultVideoPoster 메소드를 오버라이드(override) 해, getDefaultVideoPoster 메소드가 null 를 돌려주고 있는 경우, 대신의 이미지를 돌려주도록 수정하는 것으로 크래쉬 하지 않게 되었습니다.
덧붙여서 BitmapFactory.decodeResource 메소드의 제 2 인수로 지정하는 리소스 ID입니다만, png나 jpeg등의 이미지 파일을 지정할 필요가 있습니다. XML로 정의한 자원에서는 null 가 되어 버리므로 주의.
webView.webChromeClient = object : WebChromeClient() {
    override fun getDefaultVideoPoster(): Bitmap? {
        return if (super.getDefaultVideoPoster() == null) {
            BitmapFactory.decodeResource(applicationContext.resources, android.R.drawable.ic_media_play)
        } else {
            super.getDefaultVideoPoster()
        }
    }
}

결과로서는 이하와 같이 표시됩니다만, 지정한 자원이 화면에 표시되어 버려, 브라우저로 본래 표시되고 있는 내용과는 달라져 버립니다.
그러므로, 1×1픽셀의 흑화상을 준비하는 등, 눈에 띄지 않게 표시하면 좋을지도 모릅니다.



참고 URL


  • android-Bitmap.getWidth()의 null 포인터로 WebView 충돌 - 스택 오버플로
  • Android에서 WebView를 사용할 때 Manifest에 "WRITE_EXTERNAL_STORAGE" | GROUP DEV BLOG | TECHNO MOBILE
  • Bitmap.getWidth() on a null object reference at webview.getDefaultVideoPoster_Gdeer 的专栏-CSDN 박객_getdefaultvideoposter

  • WebView를 장시간 표시하면 메모리 누수가 발생한다



    사건



    WebView를 장시간 표시하면 메모리 누수가 발생합니다.
    기동 시간으로서는 단말에 의해 걸리지만, 대체로 8시간~12시간 약으로 발생하는 것 같습니다.

    원인



    지금은 잘 모르겠지만, WebView의 인스턴스를 생성한 것만으로도 발생하기 때문에, 아마 WebView측의 인스턴스 생성 처리에 문제가 있는 것 같습니다.

    해결책



    지금은 없습니다. . 인스턴스를 버려도 발생하는 것 같습니다. .
    시도하지는 않지만 대체 가능한 경우 Chrome Custom Tabs을 사용하여 해결할 수 있습니다.

    참고 URL


  • android-WebView 메모리 누수 - 스택 오버플로
  • 좋은 웹페이지 즐겨찾기