You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android WebView中为播放的Facebook视频添加下载按钮

如何在Android WebView中为播放的Facebook视频添加下载按钮

嗨,我来帮你搞定这个需求!结合你已经写的代码,我们可以补充关键部分来实现给Facebook视频添加下载按钮的功能,步骤如下:

1. 调整WebView基础配置

你已经做了不少基础配置,这里修正几个关键权限设置(之前禁用的文件访问权限会影响下载功能),同时优化适配细节:

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
// 开启文件访问权限,否则无法完成下载操作
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowContentAccess(true);
// 使用更贴近现代Chrome的User-Agent,提升页面兼容性
webView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36");

// 设置请求头模拟Chrome客户端
HashMap<String, String> headers = new HashMap<>();
headers.put("HTTP_X-Requested-With","com.android.chrome");
webView.loadUrl(getIntent().getStringExtra("URL"), headers);

2. 实现JavaScript与原生通信的接口

这个接口是连接WebView中JS代码和Android原生下载逻辑的桥梁,用来传递视频下载链接:

public class MyJavaScriptInterface {
    private Context mContext;

    public MyJavaScriptInterface(Context context) {
        mContext = context;
    }

    // 接收JS传递的视频下载链接,触发原生下载
    @JavascriptInterface
    public void onVideoDownloadLink(String videoUrl) {
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(videoUrl));
        request.setTitle("Facebook视频下载");
        request.setDescription("正在下载视频...");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "fb_video_" + System.currentTimeMillis() + ".mp4");

        DownloadManager downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
        if (downloadManager != null) {
            downloadManager.enqueue(request);
            Toast.makeText(mContext, "开始下载", Toast.LENGTH_SHORT).show();
        }
    }

    // 保留你之前的缩略图检测方法(可选)
    @JavascriptInterface
    public void onThumbnailDetected(String thumbnailUrl) {
        // 这里可以添加缩略图相关的处理逻辑
    }
}

记得在初始化WebView时绑定这个接口:

webView.addJavascriptInterface(new MyJavaScriptInterface(this), "Android");

3. 修改页面加载完成后的JS注入逻辑

你之前只检测了视频缩略图,现在我们要修改这段代码,在页面中插入下载按钮,并获取视频的播放链接:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("fb://")) {
            // 拦截Facebook的Scheme链接,避免跳转到原生App
            return true;
        } else {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 注入JS代码,添加悬浮下载按钮并绑定下载逻辑
        webView.evaluateJavascript("javascript:(function() {" +
            "var videoElement = document.querySelector('video');" +
            "if (videoElement) {" +
            "   // 避免重复添加按钮" +
            "   if (!document.getElementById('fb-video-download-btn')) {" +
            "       var btn = document.createElement('button');" +
            "       btn.id = 'fb-video-download-btn';" +
            "       btn.textContent = '下载视频';" +
            "       btn.style.position = 'fixed';" +
            "       btn.style.bottom = '20px';" +
            "       btn.style.right = '20px';" +
            "       btn.style.zIndex = '9999';" +
            "       btn.style.padding = '10px 15px';" +
            "       btn.style.backgroundColor = '#1877f2';" +
            "       btn.style.color = 'white';" +
            "       btn.style.border = 'none';" +
            "       btn.style.borderRadius = '5px';" +
            "       btn.onclick = function() {" +
            "           var videoUrl = videoElement.src;" +
            "           if (videoUrl) {" +
            "               Android.onVideoDownloadLink(videoUrl);" +
            "           }" +
            "       };" +
            "       document.body.appendChild(btn);" +
            "   }" +
            "   // 监听视频源变化,确保获取最新的播放链接" +
            "   videoElement.addEventListener('srcchange', function() {" +
            "       var videoUrl = videoElement.src;" +
            "       if (videoUrl) {" +
            "           // 可以在这里更新按钮的下载链接逻辑" +
            "       }" +
            "   });" +
            "}" +
        "})();", null);
    }
});

4. 添加必要的权限

在AndroidManifest.xml中添加下载相关的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />

注意:Android 6.0及以上版本需要动态申请WRITE_EXTERNAL_STORAGE权限

额外提示

  • Facebook的页面结构可能会更新,如果document.querySelector('video')无法找到视频元素,需要调整CSS选择器(比如用更具体的类名选择器)
  • 部分视频可能有防盗链机制,直接获取videoElement.src可能无法正常下载,这种情况需要解析页面中的视频流链接(比如从video标签的srcset属性或页面脚本中提取)

备注:内容来源于stack exchange,提问作者Moses Reff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:09:32