正如官方文档中明确指出的那样,API 级别 JELLY_BEAN_MR1 及更高级别需要使用 @JavascriptInterface 才能从 webview 端访问 java 函数。
这意味着项目构建目标必须指向解决以下导入的 API 17 或更高版本:
import android.webkit.JavascriptInterface;
android 如何处理 API 16 及以下的代码?我会得到运行时异常还是会在运行时忽略此导入?
我对这些答案感到非常惊讶......它们并不准确。如果您添加 JavascriptInterface 和另一个注解,让我们说MyAnnotation到同一个方法(就像我做的那样),然后尝试访问MyAnnotation实例注解,那么您会遇到 ClassDefNotFoundException 的惊喜!
我现在似乎可行的解决方案(已经一年多了)是将注释声明添加到应用程序项目中:
package android.webkit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface JavascriptInterface {}
这解决了 2.3.5 上的问题,并且仍然适用于 4.3 和 4.4 和 4.2。
希望这对其他人有帮助!
注释类 JavascriptInterface 不会被旧版本的 Android 加载,因此您的代码将在旧版本上运行而不会出现任何问题。
像您建议import android.webkit.JavascriptInterface;
的那样的导入只是对编译器的提示,因此它可以解析您在源代码中进一步引用的完整类路径。VM 只会ClassNotFoundException
在您尝试使用该类时抛出一个。所以简单的答案是否定的,只要您使用JavascriptInterface
以下内容保护您的使用,一切都会好起来的。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
JavascriptInterface js = new JavascriptInterface(){ ... };
}