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.xml
에 WRITE_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 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.xml
에 WRITE_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
WebView를 장시간 표시하면 메모리 누수가 발생한다
사건
WebView를 장시간 표시하면 메모리 누수가 발생합니다.
기동 시간으로서는 단말에 의해 걸리지만, 대체로 8시간~12시간 약으로 발생하는 것 같습니다.
원인
지금은 잘 모르겠지만, WebView의 인스턴스를 생성한 것만으로도 발생하기 때문에, 아마 WebView측의 인스턴스 생성 처리에 문제가 있는 것 같습니다.
해결책
지금은 없습니다. . 인스턴스를 버려도 발생하는 것 같습니다. .
시도하지는 않지만 대체 가능한 경우 Chrome Custom Tabs을 사용하여 해결할 수 있습니다.
참고 URL
Reference
이 문제에 관하여(Android WebView에서 빠진 포인트 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hiesiea/items/7ea40cdc79d9fb6ce2c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)