Android 在WebView中从Facebook获取视频url

Android 在WebView中从Facebook获取视频url,android,html,facebook,video,webview,Android,Html,Facebook,Video,Webview,我需要从Facebook下载视频。为了下载视频,我需要从Webview加载Facebook页面并获得用户登录的视频url 我尝试了以下方法来实现这一点,但没有任何效果 1. 2. 我试图从webview中的html中获取视频标记,但没有成功,因为当我们在webview中单击视频时,无法获取任何html字符串 以下是迄今为止我在WebViewActivity public class WebViewActivity extends BaseActivity {

我需要从Facebook下载视频。为了下载视频,我需要从
Webview
加载Facebook页面并获得用户登录的视频url 我尝试了以下方法来实现这一点,但没有任何效果

1.

2.

我试图从webview中的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;
        }
 }
任何帮助都将不胜感激

@覆盖
@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();
    }
}
创建时受保护的void(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webView=(webView)findviewbyd(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setPluginState(WebSettings.PluginState.ON); webView.getSettings().setBuilTinZoomControl(true); webView.getSettings().setDisplayZoomControl(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverview模式(true); addJavascriptInterface(这是“FBDownloader”); setWebViewClient(新的WebViewClient(){ @凌驾 公共void onPageFinished(WebView视图,字符串url) { if(swipeLayout.isRefreshing()) { swipeLayout.setRefreshing(false); } loadUrl(“javascript:(函数(){” +“var el=document.querySelectorAll('div[data sigil]”) +“对于(var i=0;i-1){” +“删除el[i].dataset.sigil;” +“var jsonData=JSON.parse(el[i].dataset.store);” +“el[i].setAttribute('onClick','FBDownloader.processVideo(\”'+jsonData['src']+'\”);” + "}" + "}" + "})()"); } @凌驾 public void onLoadResource(WebView视图,字符串url) { loadUrl(“javascript:(函数prepareVideo(){” +“var el=document.querySelectorAll('div[data sigil]”) +“对于(var i=0;i-1){” +“删除el[i].dataset.sigil;” +“控制台日志(i);” +“var jsonData=JSON.parse(el[i].dataset.store);” +“el[i].setAttribute('onClick','FBDownloader.processVideo(\'”+jsonData['src']+'\”,\“'+jsonData['videoID']+'”);” + "}" + "}" + "})()"); loadUrl(“javascript:(window.onload=prepareVideo + ")()"); } }); CookieSyncManager.createInstance(此); CookieManager CookieManager=CookieManager.getInstance(); cookieManager.setAcceptCookie(true); CookieSyncManager.getInstance().startSync(); loadUrl(目标url); } @JavascriptInterface public void processVideo(最终字符串vidData,最终字符串vidID) { 尝试 { 字符串mBaseFolderPath=android.os.Environment .getExternalStorageDirectory() +文件分隔符 +“FacebookVideos”+File.separator; 如果(!新文件(mBaseFolderPath).exists()) { 新文件(mBaseFolderPath).mkdir(); } 字符串mFilePath=“file://”+mBaseFolderPath+“/”+vidID+“.mp4”; Uri downloadUri=Uri.parse(vidData); DownloadManager.Request req=新的DownloadManager.Request(downloadUri); req.setDestinationUri(Uri.parse(mFilePath)); 请求setNotificationVisibility(DownloadManager.Request.VISIBILITY\u VISIBLE\u NOTIFY\u COMPLETED); DownloadManager dm=(DownloadManager)getSystemService(getApplicationContext().DOWNLOAD_服务); dm.排队(req); Toast.makeText(这个“下载开始”,Toast.LENGTH_LONG.show(); } 捕获(例外e) { Toast.makeText(此“下载失败:+e.toString(),Toast.LENGTH_LONG).show(); } }
为您的代码片段提供一些陈述或解释,这将改进您的答案。兄弟,它工作正常,请下载视频,而有些时间不会开始下载。我还需要相同代码中的播放选项,如何播放视频,请帮助我\n如果在一篇文章中发布多个视频,则该选项不起作用。有什么办法吗?在react native中有可能吗?这是有效的方法吗?我的意思是游戏团队接受这种东西?@Bro,你能帮我一下吗,当我点击按钮时,我还需要从webview下载facebook视频,请帮我一下,兄弟,我可以在webview中加载facebook,但不知道如何下载视频