Android 8.0 Oreo下WebView加载视频报NullPointerException问题求助
解决Android 8.0 WebView加载视频时的NullPointerException问题
这个问题我之前在适配Android 8.0项目时刚好碰到过,属于WebView(Chromium内核)在Android 8.0上的特定bug——系统尝试获取默认视频海报时,返回的Bitmap对象为null,进而调用getWidth()时触发空指针崩溃。
错误根源
从报错栈可以看到,崩溃发生在com.android.webview.chromium.Ap.getDefaultVideoPoster方法里,这是系统WebView内部的逻辑:当WebView加载视频且没有设置自定义海报时,系统会尝试获取一个默认海报Bitmap,但在Android 8.0的部分设备上,这个Bitmap会返回null,导致后续调用getWidth()时抛出异常。
解决方案
核心思路是自定义WebChromeClient,重写getDefaultVideoPoster()方法,确保返回一个有效的Bitmap对象,哪怕是一个空白的占位Bitmap。
修改后的代码如下:
webView = (WebView) findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient()); // 关键:重写WebChromeClient的getDefaultVideoPoster方法 webView.setWebChromeClient(new WebChromeClient() { @Override public Bitmap getDefaultVideoPoster() { // 如果系统默认返回null,就创建一个1x1的空白Bitmap Bitmap defaultPoster = super.getDefaultVideoPoster(); if (defaultPoster == null) { return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); } return defaultPoster; } }); // 注意:加载URL要加上完整的https协议,避免加载异常 webView.loadUrl("https://youtube.com/watch?v=D7LB-QPxH9c");
额外提示
- 原代码中的
loadUrl没有指定https协议,虽然这不是崩溃的直接原因,但可能导致视频加载失败,建议补充完整协议头。 - 这个方案可以直接全局使用,不会对其他系统版本产生副作用;如果想更精准适配,也可以只针对Android 8.0(API 26)单独处理。
内容的提问来源于stack exchange,提问作者William Kellington
相关产品推荐
相关产品推荐

