HarmonyOS 鸿蒙Next在js端不做修改的情况下如何使用前端页面调用应用侧函数方法
HarmonyOS 鸿蒙Next在js端不做修改的情况下如何使用前端页面调用应用侧函数方法
原有的js端调用Android定义的方法,如:window.android.getLocation()
Android端是这么写的:
public String getLocation() {
if (Config.gpsStatus != null) {
return JsonUtil.toJson(Config.gpsStatus);
}
return null;
}
这个方法不变的情况下,在harmony下要如何写,我写了:
// xxx.ets
import { webview } from ‘@kit.ArkWeb’;
import { RouterDelegate, WebLink } from ‘…/util/RouterUtils’;
class testClass1 {
constructor() {
}
test(): string {
console.log(‘WebComponent’,‘test’)
return ‘ArkTS Hello test World!’;
}
JsToJavaOnCreate(): string {
console.log(‘webview JsToJavaOnCreate’)
return ‘ArkTS Hello World!’;
}
getLocation(): string {
console.log(‘webview getLocation’)
return ‘’;
}
}
@Entry
@Component
struct WebComponent {
webviewController: webview.WebviewController = new webview.WebviewController();
private link?: string | null = (RouterDelegate.getParams() as WebLink).link
build() {
Column() {
// Web组件加载本地index.html页面
Web({ src:this.link, controller: this.webviewController})
.mixedMode(MixedMode.All)
.backgroundImage($r(‘app.media.background’))
.width(“100%”)
.height(“100%”)
// 将对象注入到web端
.javaScriptProxy({
object: new testClass1(),
name: “Android”,
methodList: [‘getLocation’],
controller: this.webviewController
})
}
}
}
也未收到有调用。
你看一下你的android代码,找一下addJavascriptInterface方法,参考:
webView.addJavascriptInterface(new JsBridge(), "JsBridge");
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
后面第二个参数是h5调用android端时的前缀,比如你这个例子,h5端就是这么调用的
JsBridge.getLocation()
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
我写了一个例子,JsBridge改成了hm,你可以参考一下
https://developer.huawei.com/consumer/cn/blog/topic/03153499434944024
如果我这个例子你试了没问题,你自己写的例子也没问题,但就是你的原有的js端没效果。那可能是你的原有的js端加了userAgent判断,可以手动修改,让原有的js误认为是android 浏览器环境。
Web().onControllerAttached(() => {
/*自定义UA/
let userAgent = ‘Android’ + this.controller.getUserAgent()
this.controller.setCustomUserAgent(userAgent);
})
在HarmonyOS(鸿蒙)系统中,如果希望在JS端不修改的情况下通过前端页面调用应用侧(Java或C++侧)的函数方法,你可以利用鸿蒙提供的API进行能力调用。通常,这涉及到使用Feature Ability API或Common Event API来实现跨语言的调用。
- Feature Ability API:如果你是在一个FA(Feature Ability)内部进行调用,可以直接通过鸿蒙的IPC(Inter-Process Communication)机制来访问。
- Common Event API:跨FA或跨设备的调用,可以使用鸿蒙的公共事件API,在JS端发送事件,在Java或C++侧监听并响应。
请确保你的鸿蒙项目配置正确,并正确使用了相应的API。如果问题依旧没法解决请加我微信,我的微信是itying888。