gpt4 book ai didi

android - evaluateJavascript 是如何工作的?

转载 作者:IT王子 更新时间:2023-10-28 23:52:06 24 4
gpt4 key购买 nike

我正在尝试使用新的 evaluateJavascript Android 4.4 中的方法,但我得到的只是一个空结果:

webView1.evaluateJavascript("return \"test\";", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Log is written, but s is always null
}
});

如何将结果返回给该方法?

更新:更多信息:

  1. 我设置了 INTERNET 权限
  2. 我有 setJavascriptEnabled(true);
  3. 试过的撇号字符串:return 'test';,
  4. 尝试过的 JS 对象:return { test: 'this' }
  5. console.log('test'); 执行良好。
  6. targetSdkVersion 设置为 19,根据:If your app uses WebView

设备: Nexus 7 和 Nexus 5(库存)

最佳答案

本示例中使用了 evaluateJavascript 方法的示例:

https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example

基本上,如果您在 WebView 中执行的 javascript 返回一个值,它将在回调中传递。

需要注意的主要是 OnReceiveValue 中返回的字符串是 JSON 值、JSON 对象或 JSON 数组,具体取决于您返回的内容。

需要注意的是,如果您返回单个值,则需要在 JSON 读取器上使用 setLenient(true) 才能使其工作。

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// In KitKat+ you should use the evaluateJavascript method
mWebView.evaluateJavascript(javascript, new ValueCallback<String>() {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onReceiveValue(String s) {
JsonReader reader = new JsonReader(new StringReader(s));

// Must set lenient to parse single values
reader.setLenient(true);

try {
if(reader.peek() != JsonToken.NULL) {
if(reader.peek() == JsonToken.STRING) {
String msg = reader.nextString();
if(msg != null) {
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}
}
}
} catch (IOException e) {
Log.e("TAG", "MainActivity: IOException", e);
} finally {
try {
reader.close();
} catch (IOException e) {
// NOOP
}
}
}
});
}

您可能仍希望对字符串响应使用解析器的原因是它被转换为 JSON 值,这意味着它将用引号括起来。

例如,如果你去了:

mWebView.evaluateJavascript("(function() { return 'this'; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Prints: "this"
}
});

它会打印字符串 this,用双引号括起来:“this”。

其他值得注意的例子:

mWebView.evaluateJavascript("(function() { return null; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Prints the string 'null' NOT Java null
}
});

mWebView.evaluateJavascript("(function() { })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); //s is Java null
}
});

mWebView.evaluateJavascript("(function() { return ''; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Prints "" (Two double quotes)
}
});

关于android - evaluateJavascript 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19788294/

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