2016-11-14 130 views
1

我需要从Facebook下载视频。为了下载视频,我需要从Webview视频网址工作的我在哪里加载的Facebook页面,用户获得登录 我曾尝试以下方法来实现这一点,但没有从WebView的Facebook获取视频网址

Link 1

2.Link 2

我试图从网页视图HTML获取视频标签,而是因为当我们点击视频上的WebView我们无法获得任何HTML字符串它没有工作

以下是我的代码已经在WebViewActivity

 public class WebViewActivity extends BaseActivity { 
      private static final String TAG = WebViewActivity.class.getSimpleName(); 

      @Override 
      protected void onCreate(@Nullable Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 

       WebView webview = new WebView(this); 
       webview.setWebChromeClient(new WebChromeClient()); 
       WebViewClient client = new ChildBrowserClient(); 
       webview.setWebViewClient(client); 
       WebSettings settings = webview.getSettings(); 
       settings.setJavaScriptEnabled(true); 
       webview.setInitialScale(1); 
       webview.getSettings().setUseWideViewPort(true); 
       settings.setJavaScriptCanOpenWindowsAutomatically(false); 
       settings.setBuiltInZoomControls(true); 
       settings.setPluginState(WebSettings.PluginState.ON); 
       settings.setDomStorageEnabled(true); 
       webview.loadUrl("http://m.facebook.com"); 
       webview.setId(5); 
       webview.setInitialScale(0); 
       webview.requestFocus(); 
       webview.requestFocusFromTouch(); 
       setContentView(webview); 
      } 

     public class ChildBrowserClient extends WebViewClient { 
      @SuppressLint("InlinedApi") 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       boolean value = true; 
       String extension = MimeTypeMap.getFileExtensionFromUrl(url); 
       if (extension != null) { 
        MimeTypeMap mime = MimeTypeMap.getSingleton(); 
        String mimeType = mime.getMimeTypeFromExtension(extension); 
        if (mimeType != null) { 
         if (mimeType.toLowerCase().contains("video") 
           || extension.toLowerCase().contains("mov") 
           || extension.toLowerCase().contains("mp4")) { 
          DownloadManager mdDownloadManager = (DownloadManager) WebViewActivity.this 
            .getSystemService(Context.DOWNLOAD_SERVICE); 
          DownloadManager.Request request = new DownloadManager.Request(
            Uri.parse(url)); 
          File destinationFile = new File(
            Environment.getExternalStorageDirectory(), 
            getFileName(url)); 
          request.setDescription("Downloading via Your app name.."); 
          request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
          request.setDestinationUri(Uri.fromFile(destinationFile)); 
          mdDownloadManager.enqueue(request); 
          value = false; 
         } 
        } 
        if (value) { 
         view.loadUrl(url); 
        } 
       } 
       return value; 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 
      } 

      /** 
      * Notify the host application that a page has started loading. 
      * 
      * @param view The webview initiating the callback. 
      * @param url The url of the page. 
      */ 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
      } 
     } 

     /** 
     * File name from URL 
     * 
     * @param url 
     * @return 
     */ 
     public String getFileName(String url) { 
      String filenameWithoutExtension = ""; 
      filenameWithoutExtension = String.valueOf(System.currentTimeMillis() 
        + ".mp4"); 
      return filenameWithoutExtension; 
     } 
} 

到目前为止已经试过任何帮助将不胜感激!

+0

@Bro,你可以请帮助我,我也需要从webview下载facebook视频,当我点击按钮时,请帮助我兄弟,我可以在webview中加载facebook,但不知道如何下载视频 –

回答

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

为您的代码片段提供一些声明或解释,这将改善您的答案。 – SsouLlesS

+0

真棒哥们!它的作品完美 –

+0

完美的工作,超级工作,工作100% –