我目前正在Webview中以HTML格式向用户显示一堆数据。我在每个条目下方都有一些链接,单击这些链接时应在我的应用程序中调用方法。 Android WebView的javascript界面​​似乎是处理这些事情的最佳方式(唯一的方式)。但是,每当我单击链接时,都会出现以下错误消息:ERROR/Web Console(6112): Uncaught TypeError: Object [my namespace]@4075ff10 has no method 'edit' at [base URL]:55
我声明了以下接口(interface):

public class JavaScriptInterface {
    Context context;

    JavaScriptInterface(Context c) {
        context = c;
    }

    public void edit(String postid) {
        Log.d("myApp", "EDIT!");
        //do stuff
    }
}

然后,将其添加到我的WebView中:
final WebView threadView = (WebView) findViewById(R.id.webViewThread);
threadView.getSettings().setJavaScriptEnabled(true);
threadView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

最后,我在HTML中将其称为:
<div class="post-actions">
    <div class="right">
        <a onClick="Android.edit('4312244');">Edit</a>
    </div>
</div>

真正的启动器是,当我通过仿真器或与手机的adb连接调试应用程序时,所有这些都可以使用。当我构建和发布该应用程序时,它坏了。

我机智。任何帮助或建议,将不胜感激!

最佳答案

我的2.3.3手机也有同样的问题。
但是,由于我知道一个应用程序有效而另一个应用程序无效,因此我对这种解决方法不满意。
而且我发现了我两个应用程序的区别。
损坏的JavaScriptInterface使用Proguard
稍作搜索后,我发现了solution

简短摘要:接口(interface)JavascriptCallback,由JavaScriptInterface实现,并在proguard.conf中为Proguard添加了规则:

public interface JavascriptCallback {

}

public class JavaScriptInterface implements JavascriptCallback {
    Context mContext;
    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }
    /** Show a toast from the web page */
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

proguard.cfg:
-keep public class YOURPACKAGENAMEHERE.JavascriptCallback
-keep public class * implements YOURPACKAGENAMEHERE.JavascriptCallback
-keepclassmembers class * implements YOURPACKAGENAMEHERE.JavascriptCallback {
    <methods>;
}

07-24 09:50
查看更多