Monday, November 13, 2017

How to detect video in Android WebView with HitTestResult?

Leave a Comment

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.

1 Answers

Answers 1

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();     } } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment