HarmonyOS 鸿蒙Next在js端不做修改的情况下如何使用前端页面调用应用侧函数方法

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next在js端不做修改的情况下如何使用前端页面调用应用侧函数方法

原有的js端调用Android定义的方法,如:window.android.getLocation()

Android端是这么写的:

    @JavascriptInterface

            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
})
}
}
}

也未收到有调用。

3 回复

你看一下你的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来实现跨语言的调用。

  1. Feature Ability API:如果你是在一个FA(Feature Ability)内部进行调用,可以直接通过鸿蒙的IPC(Inter-Process Communication)机制来访问。
  2. Common Event API:跨FA或跨设备的调用,可以使用鸿蒙的公共事件API,在JS端发送事件,在Java或C++侧监听并响应。

请确保你的鸿蒙项目配置正确,并正确使用了相应的API。如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部