【问题标题】:Turning Webcam and Light off with GWT Elemental使用 GWT Elemental 关闭网络摄像头和灯光
【发布时间】:2016-11-20 12:57:06
【问题描述】:

我找到了一段很棒的代码来打开网络摄像头并拍照,但遗憾的是,我无法找到关闭网络摄像头的方法。没有方法可以要求发生这种情况,甚至从 GWT 调用打开相机也是使用本机 JavaScript,我目前还不太熟悉。有什么想法吗?代码如下:

public native static boolean getUserVideo(UserWebcamCallback callback)/*-{
        if(navigator.webkitGetUserMedia) {
            navigator.webkitGetUserMedia(
                {video: true, toString: function() {return "video";}},
                function(stream) {
                    var s = window.URL.createObjectURL(stream);
                    $entry(callback.@com.test.ElementalUtils.UserWebcamCallback::onSuccess(Ljava/lang/String;)(s));
                    },
                function() {
                    $entry(callback.@com.test.ElementalUtils.UserWebcamCallback::onFail()());
                });
            return true;
        } else {
            return false;
        }
    }-*/;

【问题讨论】:

    标签: javascript java gwt


    【解决方案1】:

    呸!以为我会在这个上度过一个不眠之夜。 诀窍是在代码中添加一个“localStream”全局变量,然后用另一种方法关闭流。像这样:

        public native static boolean getUserVideo(UserWebcamCallback callback)/*-{
                localStream;
                if(navigator.webkitGetUserMedia) {
                    navigator.webkitGetUserMedia(
                        {video: true, toString: function() {return "video";}},
                        function(stream) {
                            var s = window.URL.createObjectURL(stream);
    
                localStream = stream;
                            $entry(callback.@com.test.ElementalUtils.UserWebcamCallback::onSuccess(Ljava/lang/String;)(s));
                            },
                        function() {
                            $entry(callback.@com.test.ElementalUtils.UserWebcamCallback::onFail()());
                        });
                    return true;
                } else {
                    return false;
                }
            }-*/;
    
    public native static void stopVideo()/*-{
    localStream.getTracks()[0].stop();
    }-*/
    

    【讨论】:

    • 作为一个想法,与其把它作为一个全局变量,不如让它成为Java类中的一个静态字段,这样以后的一些编译器优化就不会混淆,给每个JSNI方法一个不同的名字localStream - 如果您使用闭包编译器,可能会发生这种情况,并且必须调试很烦人。
    • 好的。著名的。但是你的意思是静态字段作为 java 变量还是仍然在 JavaScript 中?我什至不知道 Java 中的 JavaScript 流是什么数据类型
    • 它可以简单地是 JavaScriptObject 或 Object - JS 不会关心它是什么类型,并且没有在 Java 中实际执行此工作(顺便考虑一下,或者使用JSO 子类型或 JsInterop),您不需要 Java 中的特定类型,只需要一个字段,以便编译器正确处理它。更多关于 JSNI/JSO 的细节gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
    • BTW 奖励积分为您几乎正确使用$entry(),大多数人甚至没有得到那么远。相反,将function() {...} 传递给它。你不会注意到按你的方式做的问题,但如果你能原谅双重含义,那就是问题:你的 UncaughtExceptionHandler 不会注意到回调中的异常,并且任何调度程序的使用都会行为不端(但只是轻微的)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多