如何在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
相关产品推荐
相关产品推荐

