Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GWT Elemental关闭网络摄像头和灯光_Javascript_Java_Gwt - Fatal编程技术网

Javascript 使用GWT Elemental关闭网络摄像头和灯光

Javascript 使用GWT Elemental关闭网络摄像头和灯光,javascript,java,gwt,Javascript,Java,Gwt,我找到了一段很好的代码,可以打开网络摄像头并拍照,但遗憾的是,我想不出关闭网络摄像头的方法。没有任何方法可以实现这一点,甚至从GWT启动摄像头的调用都是使用本机JavaScript,我目前还不太熟悉。。有什么想法吗?代码如下: public native static boolean getUserVideo(UserWebcamCallback callback)/*-{ if(navigator.webkitGetUserMedia) { naviga

我找到了一段很好的代码,可以打开网络摄像头并拍照,但遗憾的是,我想不出关闭网络摄像头的方法。没有任何方法可以实现这一点,甚至从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;
        }
    }-*/;

呸!我以为这一次我会睡不着觉。 诀窍是向代码中添加一个“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
——如果使用闭包编译器,可能会发生这种情况,而且必须进行调试会很烦人。OK。注意。但是,您是指作为java变量的静态字段还是仍然在JavaScript中?我甚至不知道JavaScript流在Java中是什么数据类型它可以是
JavaScriptObject
Object
-JS不关心它是什么类型,而且如果不在Java中实际执行这项工作(顺便考虑一下,使用JSO子类型或JsInterop),就不需要Java中的特定类型,只是一个字段,以便编译器正确处理它。更多关于JSNI/JSOs的详细信息顺便说一句,对于几乎正确使用
$entry()
的您来说,大多数人甚至都没有做到这一点。相反,将
函数(){…}
传递给它。您不会注意到按自己的方式执行时出现的问题,但如果您不介意双重含义,这就是问题所在:您的UncaughtExceptionHandler不会注意到回调中的异常,并且任何调度程序使用都会出现错误(但只是轻微的错误)。