【问题标题】:Displaying video in a web view causes Null Pointer Exception在 Web 视图中显示视频会导致空指针异常
【发布时间】:2017-04-17 04:16:33
【问题描述】:

我正在尝试显示一个给定网址的视频。下面是包含WebView的部分布局:

<android.support.v4.widget.NestedScrollView
    android:id="@+id/nested_scrollview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">


    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="blocksDescendants"
            android:orientation="vertical">

        ......
        ......

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:orientation="vertical">

            ......

            <WebView
                android:id="@+id/video"
                android:layout_width="wrap_content"
                android:layout_height="180dp"
                android:visibility="gone"
                android:layout_marginTop="24dp"/>

            ......

        </LinearLayout>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

这是我显示视频的方式:

if(url != null && mVideo != null) {
    WebSettings settings = mVideo.getSettings();
    settings.setJavaScriptEnabled(true);

    String videoFrame = "<html><head><style type=\'text/css\'>body{margin:auto;text-align:center;}</style></head>" +
                    "<body><iframe width=\"90%%\" height=\"100%%\" src=\"https:" + url + "\" frameborder=\"0\"></iframe></body></html>";

    mVideo.loadData(videoFrame, "text/html", "utf-8");
}

虽然这是我遇到的错误:

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:1181)
                                                             at org.chromium.android_webview.DefaultVideoPosterRequestHandler$1.run(DefaultVideoPosterRequestHandler.java:39)
                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                             at android.os.Looper.loop(Looper.java:154)
                                                             at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

难点在于,有时会发生这种情况,有时不会。所以很难确定问题所在。

除此之外,我还遇到了here 报告的问题,尽管它似乎不影响我显示视频的方式。

【问题讨论】:

  • 我最近遇到了同样的问题。我真的很困惑是什么原因造成的,但清理项目似乎是一个临时修复。

标签: android nullpointerexception android-webview


【解决方案1】:

如果其他人偶然发现此崩溃,这里有一个可能的修复:

该错误是由于getDefaultVideoPoster()方法由于某种原因抛出异常引起的。这个想法是覆盖该方法并将代码包装到 try/catch 块中。如果默认方法失败,我们使用我们的一个可绘制对象构建一个后备视频海报。代码在 Kotlin 中。

webView.webChromeClient = object : WebChromeClient() {
        override fun getDefaultVideoPoster(): Bitmap? {
            return try {
                super.getDefaultVideoPoster()
            } catch (e: Exception) {
                BitmapFactory.decodeResource(resources, R.drawable.default_video_poster)
            }
        }
    }

default_video_poster 是一个可绘制的,用作后备视频海报。如果您赶时间并且无法自己制作,我会使用以下方法:

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2013-07-27
    • 1970-01-01
    • 2014-08-02
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多