Search code examples
androidfacebookwebviewandroid-webview

How to detect video in Android WebView with HitTestResult?


Like we detect anchor text using hitTestResult.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE, How can I detect a video playing on Facebook?

I want to know the hitTestResult.GetExtra() for a video file and then search for its valid extension (.mp4) and then download the file.


Solution

  • So as I understand based on what you described you load your FB page in a WebView and want to download .mp4 videos if there is one. This code will do it for you

    @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();
        }
    }