Hy我有一个非常奇怪的问题,我的应用程序是一个电子阅读器。调用Web视图的函数我使用javascript类:
public class MyJavaScriptInterface {
Context mContext;
/* Instantiate the interface and set the context */
MyJavaScriptInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void functionToCall(String input) {
System.out.println("this function was called: "+ input);
}
}
我有一个自定义的网页视图,我在其中添加了myJavascript类。
public class newBTWebView extends WebView implements {
public newBTWebView(Context context) {
super(context);
init(context);
}
public void init(Context context) {
System.out.println("newBTWebview init");
this.context = context;
this.getSettings().setJavaScriptEnabled(true);
setInitialScale(100);
addJavascriptInterface(new MyJavaScriptInterface(this.context), "HTMLOUT");
}
}
在我的主要活动中,我启动了Web视图并使用javascript调用该函数:
public class BookReader extends Activity implements WebViewDelegate{
private static Context mContext;
private static newBTWebView testWV;
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("onCreate");
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
testWV = (newBTWebView) findViewById(R.id.mywebview1);
testWV.setDelegate(this);
testWV.setWebChromeClient(new WebChromeClient());
testWV.getSettings().setJavaScriptEnabled(true);
testWV.getSettings().setPluginState(PluginState.ON);
testWV.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
System.out.println("shouldOverrideUrlLoading: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
System.out.println("onPageFinished");
}
}
}
public void callMyFunction
{
System.out.println("callMyFunction");
testWV.loadUrl("javascript:window.HTMLOUT.functionToCall('myinput');”);
}
}
functionToCall最近在我的最新更新中工作得很好,因为我在设备上测试它仍在工作的应用程序,但是当我在商店提交它时,functionToCall不再被调用了。我在设备上测试了apk文件,而没有调用functionToCall。它只适用于我直接从电脑上运行应用程序到设备,但在函数调用之前使用的同一设备上使用apk文件不会被调用。 我已经在三星S4,三星Note 10.1和nexus note上进行了测试。与android 4.4.2,4.0.4和5.0.1
任何建议表示赞赏, 谢谢。
答案 0 :(得分:3)
您是否已启用proguard或某些代码混淆?如果是,则应添加keep属性
-keep public class com.MyJavaScriptInterface
-keep public class * implements com.MyJavaScriptInterface
-keepclassmembers class * implements com.MyJavaScriptInterface {
<fields>;
<methods>;
}
我不知道你的班级是否是完全合格的名字。所以请把你的完全合格的名字。