4

正如官方文档中明确指出的那样,API 级别 JELLY_BEAN_MR1 及更高级别需要使用 @JavascriptInterface 才能从 webview 端访问 java 函数。

这意味着项目构建目标必须指向解决以下导入的 API 17 或更高版本:

import android.webkit.JavascriptInterface;

android 如何处理 API 16 及以下的代码?我会得到运行时异常还是会在运行时忽略此导入?

4

3 回答 3

5

我对这些答案感到非常惊讶......它们并不准确。如果您添加 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。

希望这对其他人有帮助!

于 2013-12-25T15:23:13.190 回答
4

注释类 JavascriptInterface 不会被旧版本的 Android 加载,因此您的代码将在旧版本上运行而不会出现任何问题。

于 2013-05-05T04:23:53.987 回答
0

像您建议import android.webkit.JavascriptInterface;的那样的导入只是对编译器的提示,因此它可以解析您在源代码中进一步引用的完整类路径。VM 只会ClassNotFoundException在您尝试使用该类时抛出一个。所以简单的答案是否定的,只要您使用JavascriptInterface以下内容保护您的使用,一切都会好起来的。

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
        JavascriptInterface js = new JavascriptInterface(){ ... };
    }
于 2013-05-05T01:06:52.633 回答