这个问题似乎很重复,但是我尝试了SO中的所有解决方案,但对我没有任何帮助。
我的问题是,我想从cordova java文件(从CordovaPlugin
扩展而来)调用javascript函数。为此,我已经在线检查了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);*/
}
}
最佳答案
您可以尝试这样的操作-cordova
和webView
由CordovaPlugin
类隐式定义:
public class MyPlugin extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
if(action.equals("foo")){
executeGlobalJavascript("alert('hello')");
}
return true;
}
private void executeGlobalJavascript(final String jsString){
cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:" + jsString);
}
});
}
}