【问题标题】:WebView setWebViewClient() with Facebook Live Stream = ActivityNotFoundExceptionWebView setWebViewClient() with Facebook Live Stream = ActivityNotFoundException
【发布时间】:2017-02-06 17:18:39
【问题描述】:

我有一个带有 Facebook Live Stream 简单 HTML 的 WebView:

<html>
    <head></head>
    <body>
        <iframe allowfullscreen="true" allowtransparency="true" frameborder="0" height="315" scrolling="no" src="https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fnico.up.9%2Fvideos%2F1895877650644648%2F&show_text=0&width=560" style="border:none;overflow:hidden" width="560"></iframe>
    </body>
</html>

我必须重写我的 WebView 的 shouldOverrideUrlLoading() 方法,所以像这样设置一个 WebViewClient :

webview.setWebViewClient(new WebViewClient()
{
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        if (url.contains("mydomain.com")) {
            //I must do something in my app, without to load url
        } else {
            //else i want open native Android browser
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            browserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getActivity().startActivity(browserIntent);
        }
        return true;//never to load the url in my webview
    }
});

问题是,如果我有 Facebook 直播,我就会崩溃!

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=intent://video/?id={10155200044259063}&ref=m_embedded_video/ }

实际上,Facebook 的 iframe 希望使用自定义 uri intent://

在 Facebook 原生应用中打开直播

我怎样才能正确对待这个 uri?!

在我的测试中:

  • 如果我不添加我的自定义 WebViewClient(从不调用 setWebViewClient()),它会完美运行!
  • 如果我不启动新 Activity 并且返回 false,我没有崩溃,但我可以看到 iframe 中加载的 Chrome 错误:ERR_UNKNOWN_URL_SCHEME!

最奇葩的是:

  • 为什么如果我只添加这个简单的行:webview.setWebViewClient(new WebViewClient()); 我有 ERR_UNKNOWN_URL_SCHEME,如果我删除它就可以工作!!!?

感谢您的帮助。

【问题讨论】:

  • 如果你不调用setWebViewClient,它会在你手机的默认浏览器上加载吗?
  • 如果我不调用 setWebViewClient,一切正常:新 url (http://) 加载到我手机的默认浏览器中,并在 fb 应用程序中打开 Facebook Live Stream (intent://) 的 url。
  • 这就是你想要的行为? (如果 url 是您自己的域,还要做什么?)
  • 是的,我想打开我的 web 视图之外的所有 url,我必须为点击的特定域做特定的事情。

标签: android facebook android-intent webview


【解决方案1】:

回答您的一个问题

为什么如果我只添加这个简单的行:webview.setWebViewClient(new WebViewClient()); 我有 ERR_UNKNOWN_URL_SCHEME,如果我删除它 工作!!!?

请注意,如果您不调用setWebViewClient(new WebViewClient()),WebView 的默认行为是启动处理 URL 的应用程序。否则,使用 WebViewClient 类的实例设置客户端将在您的 WebView 对象中加载 URL。

https://developer.android.com/guide/webapps/webview.html#HandlingNavigation

因此,如果您调用setWebViewClient(new WebViewClient()),您实际上是在执行类似于在shouldOverrideUrlLoading() 中返回false 的代码。因此给你同样的ERR_UNKNOWN_URL_SCHEME 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多