【问题标题】: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?

【问题讨论】:

    标签: android performance video webview download


    【解决方案1】:

    您可以使用 JavaScript 检测视频是否正在播放。

    1. assets 目录下创建一个.js 文件,并像这样声明一个JavaScript 函数和jQuery:

      $("video").on("play", function() {
       //You can call JavaScriptInterface here.
      });
      
    2. 在包含视频的网页中插入此 .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

    3. 完成!如果你使用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 JavaScriptInterfaceval 用于Kotlin。在我的答案中检查数字 2。我在Java 版本中链接了相同代码的网址。
    • 非常感谢,不可以,但是有没有可能获取当前正在播放的视频的直接url?
    • @NilsBe 我听说有一种方法可以使用JavaScript 获取视频网址,但我从未尝试过。这个怎么样?有一个标志(如布尔类型变量,表示是否正在播放视频)并在onLoadResources 方法中,仅获取视频网址此标志为假(视频未播放)。
    • 您好@mel.j,我已遵循您的解决方案,但它不起作用。你能给我完整的样品吗?提前致谢!
    猜你喜欢
    • 2012-12-29
    • 2019-08-19
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2016-02-05
    • 2016-08-02
    相关资源
    最近更新 更多