java - 在JavaFX中静音一个WebView,有可能吗?

标签 java javafx webview javafx-webview

非常简单。是否可以静音或控制 JavaFX WebView 的音量?我用谷歌搜索了一段时间,但我找不到任何提及这一点。我查看了 WebViewWebEngine 的代码,似乎没有关于控制音量的任何内容。

我仍然需要同一个应用程序中的其他 MediaPlayer 来工作并产生声音,所以我不能将整个应用程序静音。

最佳答案

目前,WebViewWebEngine 控件中没有这样的声音系统 API。

但您可以注入(inject) JavaScript 来静音/取消静音和控制声音。此方法仅适用于 HTML5 元素 < video >< audio >,因为像 FlashJS 这样的项目初始化的音频通常是不可能限制的。我已经为你创建了示例程序:

WebView mute/unmute - program

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        WebView myWebView = new WebView();
        WebEngine engine = myWebView.getEngine();
        //dirty code xD

        Button btn = new Button("Load Youtube");
        btn.setOnAction((ActionEvent event) -> engine.load("http://www.youtube.com/embed/A6hrw6KGdtM?autoplay=1"));

        Button btn2 = new Button("Mute");
        btn2.setOnAction((ActionEvent event) -> engine.executeScript(getJSAudioVideo(true)));

        Button btn3 = new Button("Unmute");
        btn3.setOnAction((ActionEvent event) -> engine.executeScript(getJSAudioVideo(false)));

        Button btn4 = new Button("+");
        btn4.setOnAction((ActionEvent event) -> engine.executeScript(getJSSoundVolume(0.9)));

        Button btn5 = new Button("-");
        btn5.setOnAction((ActionEvent event) -> engine.executeScript(getJSSoundVolume(0.1)));

        VBox root = new VBox();
        root.getChildren().addAll(myWebView, btn, btn2, btn3, btn4, btn5);

        Scene scene = new Scene(root, 800, 500);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Mute a WebView in JavaFX, is it possible?");

        primaryStage.show();
    }

    /**
     * @param mute
     * @return JS code for mute/unmute
     */
    public String getJSAudioVideo(boolean mute){
        return "var videos = document.querySelectorAll('video'),\n" +
                "    audios = document.querySelectorAll('listen');\n" +
                "    [].forEach.call(videos, function(video) { video.muted = "+String.valueOf(mute)+"; });\n" +
                "    [].forEach.call(audios, function(audio) { audio.muted = "+String.valueOf(mute)+"; });";
    }

    /**
     * @param volume
     * @return JS code for setting volume sound
     */
    public String getJSSoundVolume(double volume){
        //max 1.0, min 0.0 Default: 1.0
        double _volume = (volume > 1.0 || volume < 0.0) ? 1.0 : volume;

        return "var videos = document.querySelectorAll('video'),\n" +
                "    audios = document.querySelectorAll('listen');\n" +
                "    [].forEach.call(videos, function(video) { video.volume = "+String.valueOf(_volume)+"; });\n" +
                "    [].forEach.call(audios, function(audio) { audio.volume = "+String.valueOf(_volume)+"; });";

    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于java - 在JavaFX中静音一个WebView,有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49261248/

相关文章:

java - 仅当存在时,checkstyle 中是否可以验证类上的 javadoc

java - 如何将工具提示添加到 JavaFX 8 中的 TableView 标题单元格

javascript - 无法从 android webview 内的网页进行语音通话

android - 哪个更安全 : External browser or ChromeTab for authorization?

iphone - iOS 中从左向右滚动时如何获取 Web View 中的滚动方向?

java - java中如何获取ArrayList中的元素

java - 为什么通过二维数组打印时显示整个对象属性

java - RxJava "serialize"方法用例

java - 从 TableView 和 UpdateItem 重写方法获取行

directory - JavaFX 文件选择器和目录选择器