- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在这个话题上遇到了麻烦(好几天了)。
例如,基本上,我想将一个 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。
关于java - 如何通过 Android addJavascriptInterface 将非原始对象从 Java 传递给 JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173888/
是否可以将js中的任意函数对象传递给java端,让java调用那个js对象? (回调) 例如,(access是已经注册调用Java函数的函数) access(function(blabla){
我知道要从 Javascript 与 Java 交互,您必须使用 webview 中的 addjavascriptInterface 方法注入(inject) Java 对象。 这是我面临的问题。 我
我正在尝试向当前加载的 html 添加一些新内容(在 webview 中),这不是问题所在,我可以通过 javascript 向主体添加新标签,假设这样: loadUrl("javascript:(f
我在我的应用程序中使用 addJavascriptInterface 从 Javascript 弹出一个共享窗口。 问题是:当我在开发环境中使用我的手机时,我可以看到弹出窗口。但同样在发布到谷歌和下载
我需要从 Web 响应中调用我的 java 函数: 这是我的代码,请指出我哪里出错了 Activity : @InjectView(R.id.loadCardWebView) android.
AndroidStudio 开始向我显示警告“不应调用 WebView.addJavascriptInterface”。但是这种方法存在并且没有被弃用。它出什么问题了?可能是我遗漏了什么,现在有更好的
我试图跟踪代码以查看 WebView 上的 addJavascriptInterface() 是如何实现的,但它深入到 native 代码中,这基本上削弱了我理解正在发生的事情的能力。 具体来说,我正
当在 html 页面中单击表格行时,我试图从我的 Web View 中获得回调。我的 Activity 如下: public class LocalizationTestActivity exten
我使用以下代码在 Android 中的 JavaScript 文件中提取字符串变量: 这是我的 JavaScript 文件: //EDIT: clsVariable = "vikrant"; fun
我想使用 phonegap cordova 在 android 中构建 native 应用程序。我找到了 2 种方法让我的 html 文件可以与我的 java 文件通信。我可以使用 appView.a
我们已经构建了 PhoneGap 插件来从我们的 Javascript 代码返回到我们的 Java 代码。我知道 Android 也有一个 addJavascriptInterface 函数。此处的文
我正在尝试将 javascript 接口(interface)添加到我找到的 WebView。我遵循了所有标准教程,但仍然在为这项任务而苦苦挣扎。添加 javascript 接口(interface)
addJavascriptInterface让我们将 java 对象注入(inject)到 Android web View 的 javascript 中。关于每个 javascript 类型可以在该
我正在使用 jQuery Mobile 和 PhoneGap 开发 Android 应用程序。这是我的 Activity : public class xxx extends DroidGap {
谷歌的 security guidelines对于 Android 应用程序开发人员具有以下内容: WebViews do not use addJavaScriptInterface() with
您可能知道,Android 的 WebView 有一个名为 addJavascriptInterface() 的方法,它可以将 Android JAVA 对象导入 Javascript 上下文。 问题
我可以从我的 phonegap java 脚本函数和 android 2.2 中使用 java 函数但相同的代码未在 API 17 上运行。我应该怎么做才能从 API 17 中的 java 脚本调用
我正在使用 MonoDroid,并希望可以从我的 WebView 调用 C# 代码。 我正在这样做(C#): protected override void OnCreate(Bundle bundl
我可以通过 WebView.addJavascriptInterface 接口(interface)接收一个 Object 吗?像这样的东西: public class JavaScriptInter
单击 HTML 按钮时,我无法在 Cordova webview 中打开链接。它显示“CordovaWebView 类型未定义方法 addJavascriptInterface(WebViewActi
我是一名优秀的程序员,十分优秀!