【发布时间】:2018-01-08 10:56:36
【问题描述】:
这个问题似乎是重复的,但我已经尝试过 SO 中的所有解决方案,但对我没有任何效果。
我的问题是,我想从cordova java 文件中调用javascript 函数(从CordovaPlugin 扩展而来)。为此,我检查了reference 1、reference 2、reference 3 以及网上的更多信息,但对我没有任何帮助
我的代码
Sample.js
function sendVoice() {
try {
ApiAIPlugin.requestVoice(
{}, // empty for simple requests, some optional parameters can be here
function (response) {
// place your result processing here
alert(JSON.stringify(response));
},
function (error) {
// place your error processing here
alert(error);
});
} catch (e) {
alert(e);
}
}
Sample.java
WebView webView = new WebView(context);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl("javascript.sendVoice();");
我尝试在 java 文件中使用简单的警报,如下所示
WebView webView = new WebView(MainActivity.this);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl("javascript:alert('hello')");
我可以看到上面的alert,但是我无法从 java 文件中访问 javascript 函数。任何人都对此有想法
更新
VoiceBotPlugin.java
package VoiceBotPlugin;
public class VoiceBotPlugin extends CordovaPlugin {
Context context;
boolean recordAudio = false;
float newX, newY, dX, dY, screenHight, screenWidth;
ImageView img;
int lastAction;
WebView webView;
public String sJava = "String from JAVA";
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("coolMethod")) {
String message = args.getString(0);
this.coolMethod(message, callbackContext);
this.webView.loadUrl("javascript:sendVoice();");
//this.webView.evaluateJavascript("sendVoice();", null);
context = this.cordova.getActivity();
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
createFlotingActionButton();
}
});
return true;
}
return false;
}
private void coolMethod(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
callbackContext.success(message);
} else {
callbackContext.error("Expected one non-empty string argument.");
}
}
private void createFlotingActionButton(){
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
params.topMargin = 0;
params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
img = new ImageView(context);
setImage(img, "icon_record");
cordova.getActivity().addContentView(img, params);
DisplayMetrics displaymetrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
screenHight = displaymetrics.heightPixels;
screenWidth = displaymetrics.widthPixels;
img.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
dX = img.getX() - event.getRawX();
dY = img.getY() - event.getRawY();
lastAction = MotionEvent.ACTION_DOWN;
break;
case MotionEvent.ACTION_MOVE:
newX = event.getRawX() + dX;
newY = event.getRawY() + dY;
// check if the view out of screen
if ((newX <= 0 || newX >= screenWidth-img.getWidth()) || (newY <= 0 || newY >= screenHight-img.getHeight()))
{
lastAction = MotionEvent.ACTION_MOVE;
break;
}
img.setX(newX);
img.setY(newY);
lastAction = MotionEvent.ACTION_MOVE;
break;
case MotionEvent.ACTION_UP:
if (lastAction == MotionEvent.ACTION_DOWN) {
if (recordAudio) {
setImage(img, "icon_record");
recordAudio = false;
} else {
setImage(img, "icon_mute");
recordAudio = true;
//callJavaScriptFunction();
}
}
break;
default:
return false;
}
return true;
}
});
}
private void setImage(ImageView imageView, String iconName){
Resources activityRes = cordova.getActivity().getResources();
int backResId = activityRes.getIdentifier(iconName, "drawable", cordova.getActivity().getPackageName());
Drawable backIcon = activityRes.getDrawable(backResId);
if (Build.VERSION.SDK_INT >= 16)
imageView.setBackground(null);
else
imageView.setBackgroundDrawable(null);
imageView.setImageDrawable(backIcon);
}
private void callJavaScriptFunction(){
WebView webView = new WebView(context);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
this.webView.loadUrl("javascript:sendVoice();");
/*String js = String.format("window.sendVoice();", null);
webView.sendJavascript(js);*/
}
}
【问题讨论】:
标签: javascript java android cordova