javascript - 使用 webview javascript 在 android 中下载 facebook 视频
问题描述
我正在创建一个 Facebook 视频下载器应用程序,但我想在 LoadResource 上播放视频链接我想在点击监听器上获得一个视频链接。这是我的代码。
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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) {
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("https://m.facebook.com/");
}
@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();
}
}
}
但是这段代码不能正常工作。这不会返回任何视频链接。我尝试了很多方法并在 GitHub 上进行了搜索,但都失败了。谁能建议任何方法来做到这一点?
提前致谢!!
解决方案
你确定你在“vidID”中获得 url,ProcessVideo 的第二个参数很有趣吗?我想你会在“vidData”第一个参数中获得可下载的链接。在下载过程中更改第一个参数,你的代码将开始正常工作。 .. 但是有人认为我想提一下这段代码在android7或更高版本上无法正常工作....
推荐阅读
- python-3.x - 带有 https 的 Kivy UrlRequest
- r - 使格子图中的某些线条不可见
- paypal - Paypal Sandbox Orders API - 捕获后资金未添加到余额中
- emacs - “选择已删除缓冲区”的“org-agenda-get-day-entries”错误
- html - 使用 Safari 在输入焦点上不需要的自动滚动到顶部
- javascript - 比较日期字符串
- javascript - C#多维数组只打印第一个元素
- c - 将函数传递给函数时,需要作为一元“&”操作数的错误左值
- wordpress - Htaccess 重定向到不同的文件夹
- javascript - 无法在 setTimeOut 中获取 conversationState 属性值