gpt4 book ai didi

java - 如何通过 Android addJavascriptInterface 将非原始对象从 Java 传递给 JS?

转载 作者:搜寻专家 更新时间:2023-11-01 08:01:04 26 4
gpt4 key购买 nike

我在这个话题上遇到了麻烦(好几天了)。

例如,基本上,我想将一个 Java WebSocketClient 对象传递给 Android Webview JS 按需,所以写了一段代码引用:

Java

    wv.addJavascriptInterface(new WebSocketFactory(), "factoryJ");

public class WebSocketFactory {
//.............
public WebSocket getInstance(String url) {
socket = new WebSocket(new URI(url));
return socket;
}
}

JS

 var url = "ws:someaddress";
var ws = factoryJ.getInstance(url);
console.log(ws.toString()) // object pointer displayed
console.log(ws.getReadyState()); //Uncaught Error: Error calling method on NPObject!

Uncaught Error :在 NPObject 上调用方法时出错!

这个概念至少对我来说 avove Android4.2+ 不起作用。,因为 addJavascriptInterface() 仅适用于 Java 基本类型和字符串。

比照)

据我所知,将JAVA对象传递给JS的唯一方法是:

wv.addJavascriptInterface(JavaObject, "JsObject");

当然,只要传递的 JavaObject 是预先确定的,这应该可以正常工作,但是由于 WebSocket 对象是按需的,我需要为此进行一些破解。

因此,我将 JavaObject 准备为一些 WebSocket 数组。

   WebSocketNew[] ws = new WebSocketNew[99999];
wv.addJavascriptInterface(ws, "wsJ");

不幸的是,JS 将 wsJ[n] 视为 undefined ;似乎也不允许传递 ArrayObject。

我看了Java的JSON或者JSON数组都可以传,但是毕竟是string,不能这样解决,我我纠正了吗?

可能在过去,Android Java-JS 交互实现的更自由,但在安全问题下,它们限制更多(注解 @JavascriptInterface 是一个,不仅如此,而且其他因素)Android 4.2.1, WebView and javascript interface breaks

如何通过Android addJavascriptInterface将非原始对象从Java传递给JS?

有什么想法吗?

谢谢。

最佳答案

你说得对,Javascript 接口(interface)方法只能返回字符串和原始类型。如果需要返回更复杂的对象,可以尝试将对象序列化为 JSON。但是,这仅适用于模型级对象。如果您需要返回一个包含功能的类,我知道的唯一方法是包装该类,并将其每个方法公开为 @JavascriptInterface。例如:

class Foo {
private WrappedClass myWrappedClass;

public Foo(WrappedClass classToWrap) {
myWrappedClass = classToWrap;
}

@JavascriptInterface
public String doSomething1() {
return myWrappedClass.doSomething1();
}

@JavascriptInterface
public int doSomething2() {
return myWrappedClass.doSomething2();
}

// Etc.
}

这很乏味。

但是,看起来您正在尝试使用 websockets。你考虑过 Socket.io 吗?它将允许您在 Javascript 中使用网络套接字,而不是依赖于 JavascriptInterface。

http://socket.io

关于java - 如何通过 Android addJavascriptInterface 将非原始对象从 Java 传递给 JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com