检查 WebView 是不是正在播放视频
Posted
技术标签:
【中文标题】检查 WebView 是不是正在播放视频【英文标题】:Check if a WebView is playing a video检查 WebView 是否正在播放视频 【发布时间】:2018-12-18 06:09:48 【问题描述】:是否可以检查 WebView 目前是否正在播放视频,如果是,则获取该视频的 http://... .mp4/ URL 以进行下载?
我已经尝试过这段代码:
public void onLoadResource(WebView view, final String url)
super.onLoadResource(view, url);
if(url.endsWith(".mp4") & !url.contains(".jpg") & !url.contains(".png"))
AlertDialog.Builder video_downloaden = new AlertDialog.Builder(SearchActivity.this);
video_downloaden.setTitle("Video downloaden?");
video_downloaden.setMessage("Download Video?");
video_downloaden.setPositiveButton("YES", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
DownloadManager.Request request_video = new DownloadManager.Request(Uri.parse(url));
request_video.allowScanningByMediaScanner();
request_video.setVisibleInDownloadsUi(false);
DownloadManager downloadManager2 = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
request_video.setDestinationInExternalFilesDir(getApplicationContext(), DIRECTORY_DOWNLOADS, File.separator + ".Videos" + File.separator + "video" + video_number);
downloadManager2.enqueue(request_video);
Toast.makeText(SearchActivity.this,"Download started",Toast.LENGTH_LONG).show();
);
video_downloaden.setNegativeButton("NO", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
dialogInterface.cancel();
);
video_downloaden.show();
但是对于onLoadResource()
,AlertDialog 一直显示,并且每次都无法下载...
所以我的问题是,是否还有其他机会检查 WebView 是否正在播放视频并获取视频 url?
【问题讨论】:
【参考方案1】:您可以使用 javascript 检测视频是否正在播放。
在assets
目录下创建一个.js
文件,并像这样声明一个JavaScript 函数和jQuery:
$("video").on("play", function()
//You can call JavaScriptInterface here.
);
在包含视频的网页中插入此 .js
文件。我在调用onPageFinished
时插入了.js
文件。
view?.context?.assets?.let
val inputStream: InputStream = it.open(scriptFile)
val buffer = ByteArray(inputStream.available())
inputStream.read(buffer)
inputStream.close()
val encoded = Base64.encodeToString(buffer, Base64.NO_WRAP)
view.loadUrl("javascript:(function() " +
"var parent = document.getElementsByTagName('head').item(0);" +
"var script = document.createElement('script');" +
"script.type = 'text/javascript';" +
"script.innerhtml = window.atob('$encoded');" +
"parent.appendChild(script)" +
")()")
如果您不熟悉 Kotlin,请查看此参考:android Web-View : Inject local Javascript file to Remote Webpage
完成!如果你使用JavaScriptInterface
,你可以做任何你想做的事,像这样。
class WebScriptInterface(val button: View)
@JavascriptInterface
fun hideFloatingButton()
if (button.visibility == View.VISIBLE)
button.visibility = View.GONE
设置webView
使用JavaScriptInterface
。
webView.addJavascriptInterface
(WebScriptInterface(binding.floatBrowserCollect), "App")
然后调用。
$("video").on("play", function()
App.hideFloatingButton()
);
希望对你有帮助。
【讨论】:
感谢您的遮阳篷。但是我仍然有一些问题:我不能使用@JavaScriptInterface
因为:Android Studio 说:这里不允许注释。而且我不知道如何使用 JavaScript(因为这是我第一次使用它)当我复制这段代码时,我只会得到错误。 (例如view?.context?.assets?.let
val 是什么意思?对不起我的愚蠢问题,但我是编程的初学者......
@NilsBe 看到这个。 How to add JavaScriptInterface 和val
用于Kotlin
。在我的答案中检查数字 2。我在Java
版本中链接了相同代码的网址。
非常感谢,不可以,但是有没有可能获取当前正在播放的视频的直接url?
@NilsBe 我听说有一种方法可以使用JavaScript
获取视频网址,但我从未尝试过。这个怎么样?有一个标志(如布尔类型变量,表示是否正在播放视频)并在onLoadResources
方法中,仅获取视频网址此标志为假(视频未播放)。
您好@mel.j,我已遵循您的解决方案,但它不起作用。你能给我完整的样品吗?提前致谢!以上是关于检查 WebView 是不是正在播放视频的主要内容,如果未能解决你的问题,请参考以下文章