检查一个WebView是否正在播放视频

3

有没有可能检查一个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是否正在播放视频并获取视频网址?

1个回答

3
您可以使用JavaScript检测视频是否正在播放。
  1. Create a .js file in the assets directory and declare a JavaScript function and jQuery like this:

    $("video").on("play", function() {
     //You can call JavaScriptInterface here.
    });
    
  2. Insert this .js file in web page that contains video. I inserted .js file when onPageFinished is called.

    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)" +
                "})()")
    

    If you are not familiar with Kotlin, check this reference: Android Web-View : Inject local Javascript file to Remote Webpage

  3. Done! If you use JavaScriptInterface, you can do whatever you want, like this.

    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是什么意思呢?对不起,我的问题可能很愚蠢,但我是一个编程初学者... - Nils Be
@NilsBe 请看这里。如何添加JavaScriptInterface 而且val是在Kotlin中使用的。请查看我的回答中的第二点。我链接了一个相同代码的Java版本的网址。 - mel
非常感谢,现在它可以工作了,但是是否有可能获取当前播放的视频的直接URL? - Nils Be
@NilsBe 我听说可以使用 JavaScript 获取视频 URL,但我从未尝试过。这个方案怎么样?创建一个标志(类似布尔类型变量,表示视频是否正在播放),在 onLoadResources 方法中,只有在该标志为 false 时(视频未播放)才获取视频 URL。 - mel
你好 @mel.j, 我已经按照你的解决方案尝试了,但是它并没有起作用。能否请您提供完整的示例?非常感谢! - Na Pro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接