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