You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:21:11