使用JavascriptInterface时未捕获TypeError

Mr.*_*. S 14 javascript android android-webview

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

我声明了以下接口:

public class JavaScriptInterface {
    Context context;

    JavaScriptInterface(Context c) {
        context = c;
    }

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

然后我将它添加到我的WebView:

final WebView threadView = (WebView) findViewById(R.id.webViewThread);
threadView.getSettings().setJavaScriptEnabled(true);
threadView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
Run Code Online (Sandbox Code Playgroud)

最后,我在我的HTML中调用它如下:

<div class="post-actions">
    <div class="right">
        <a onClick="Android.edit('4312244');">Edit</a>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

当我通过模拟器或adb连接到我的手机调试我的应用程序时,真正的踢球者就是这一切.当我构建和发布应用程序时,它会中断.

我的智慧结束了.任何帮助或建议将不胜感激!

小智 19

我的2.3.3手机也有同样的问题.但是,由于我知道一个应用程序有效,另一个应用程序没有,我对此解决方法不满意.我发现了我的两个应用程序的不同之处.JavaScriptInterface损坏的那个使用Proguard.经过一番搜索后,我找到了解决方案.

简短摘要:接口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();
    }
}
Run Code Online (Sandbox Code Playgroud)

proguard.cfg:

-keep public class YOURPACKAGENAMEHERE.JavascriptCallback
-keep public class * implements YOURPACKAGENAMEHERE.JavascriptCallback
-keepclassmembers class * implements YOURPACKAGENAMEHERE.JavascriptCallback {
    <methods>;
}
Run Code Online (Sandbox Code Playgroud)