【问题标题】:How to detect video in Android WebView with HitTestResult?如何使用 HitTestResult 检测 Android WebView 中的视频?
【发布时间】:2017-11-01 16:01:02
【问题描述】:

就像我们使用 hitTestResult.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE 检测锚文本一样,我如何检测 Facebook 上播放的视频?

我想知道视频文件的hitTestResult.GetExtra(),然后搜索其有效扩展名 (.mp4),然后下载该文件。

【问题讨论】:

  • 您能否提供更多关于您正在使用什么以及您想从哪里获取这些信息的信息?无法理解这种说法:“如何检测 Facebook 上播放的视频?”
  • 我正在使用 web 视图。 URL 是 touch.facebook.com 现在它有视频,我如何检测和下载该网站的视频?
  • 您可以使用 cookie 和元数据,您可以通过在 webview 中截获 URL 来获得。
  • @HarshDalwadi 视频存储在 cookie 中?
  • 不,完全没有@TheOnlyAnil

标签: android facebook webview android-webview


【解决方案1】:

据我了解,根据您的描述,您将 FB 页面加载到 WebView 并希望下载 .mp4 视频(如果有)。这段代码会帮你搞定的

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    webView = (WebView)findViewById(R.id.webView);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setDisplayZoomControls(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.addJavascriptInterface(this, "FBDownloader");
    webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url)
            {
                if (swipeLayout.isRefreshing())
                {
                    swipeLayout.setRefreshing(false);
                }

                webView.loadUrl("javascript:(function() { "
                                + "var el = document.querySelectorAll('div[data-sigil]');"
                                + "for(var i=0;i<el.length; i++)"
                                + "{"
                                + "var sigil = el[i].dataset.sigil;"
                                + "if(sigil.indexOf('inlineVideo') > -1){"
                                + "delete el[i].dataset.sigil;"
                                + "var jsonData = JSON.parse(el[i].dataset.store);"
                                + "el[i].setAttribute('onClick', 'FBDownloader.processVideo(\"'+jsonData['src']+'\");');"
                                + "}" + "}" + "})()");
            }

            @Override
            public void onLoadResource(WebView view, String url)
            {
                webView.loadUrl("javascript:(function prepareVideo() { "
                                + "var el = document.querySelectorAll('div[data-sigil]');"
                                + "for(var i=0;i<el.length; i++)"
                                + "{"
                                + "var sigil = el[i].dataset.sigil;"
                                + "if(sigil.indexOf('inlineVideo') > -1){"
                                + "delete el[i].dataset.sigil;"
                                + "console.log(i);"
                                + "var jsonData = JSON.parse(el[i].dataset.store);"
                                + "el[i].setAttribute('onClick', 'FBDownloader.processVideo(\"'+jsonData['src']+'\",\"'+jsonData['videoID']+'\");');"
                                + "}" + "}" + "})()");
                webView.loadUrl("javascript:( window.onload=prepareVideo;"
                                + ")()");
            }
        });

    CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    CookieSyncManager.getInstance().startSync();

    webView.loadUrl(target_url);
}

@JavascriptInterface
public void processVideo(final String vidData, final String vidID)
{
    try
    {
        String mBaseFolderPath = android.os.Environment
            .getExternalStorageDirectory()
            + File.separator
            + "FacebookVideos" + File.separator;
        if (!new File(mBaseFolderPath).exists())
        {
            new File(mBaseFolderPath).mkdir();
        }
        String mFilePath = "file://" + mBaseFolderPath + "/" + vidID + ".mp4";

        Uri downloadUri = Uri.parse(vidData);
        DownloadManager.Request req = new DownloadManager.Request(downloadUri);
        req.setDestinationUri(Uri.parse(mFilePath));
        req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        DownloadManager dm = (DownloadManager) getSystemService(getApplicationContext().DOWNLOAD_SERVICE);
        dm.enqueue(req);
        Toast.makeText(this, "Download Started", Toast.LENGTH_LONG).show();
    }
    catch (Exception e)
    {
        Toast.makeText(this, "Download Failed: " + e.toString(), Toast.LENGTH_LONG).show();
    }
}

【讨论】:

  • 如何检测图像?支持检测视频脚本。
  • @Rainmaker 如何为任何播放视频的网站执行此操作?
  • @MayankPandya 检查这个链接,接受的答案有一个类似的脚本来检测视频stackoverflow.com/questions/51264506/…
  • @Rainmaker 感谢您的回复。但该链接仅检测在 webview 中播放的视频,我不知道如何下载该播放视频。你能给我一些建议吗?
  • @MayankPandya 您可以重用我回答中的脚本,因为您需要基本相同的 JavaScript 界面,或者如果您需要准备好运行的解决方案,最好为此提出一个独立的问题.
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2011-12-31
相关资源
最近更新 更多