记一次非常规用法,适合缝合代码,现在发这篇文章可能比较迟了,因为鸿蒙要放弃java和js了。
公司有奇怪的需求,因为公司作web应用,前台分离做的很好,所以鸿蒙app也用了该方法,js+AceInternalAbility调用,该调用官方文档有js+java:
这里就不赘述了,正常调用,大家看看就会了
这里公司要求调用摄像头扫码,js官方没有调用调用扫码,所以需要pa使用java调用,尴尬的是页面是js写的,大佬大都直接是用xml加Slice弄得页面,所以作为缝合的我只能研究一下这个AceInternalAbility调用普通Ability,翻了半天文档才发现其实也挺简单的,贴代码:
//官方例子做了修改,js还是正常订阅pa,比如7555
case 7555:
{
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("xxxx")
.withAbilityName("xxxx")
.build();
intent.setOperation(operation);
try {
MainAbility.context.startAbility(intent, 0);
} catch (Exception e){
break;
}
}
就是start,Ability他就能拉起来普通Ability,
这里贴上大佬的java相机使用项目:
ohos-ZBLibrary: Ohos_ZBLibrary 架构,提供一套开发标准(View, Data, Event)以及模板和工具类并规范代码
这样就可使用项目中的ability
调回之前页面关闭ability就行,AbilitySlice中加一行terminate();就可以关闭
返回结果回调js的话可以在主AceInternalAbility中订阅,上代码:
private IRemoteObject notifier;
//s回调方法
public void javaCallJsMsg(String msg, CallBack callBack) {
MessageParcel notifyData = MessageParcel.obtain();
notifyData.writeString(msg);
try {
if (notifier != null && callBack != null) {
notifier.sendRequest(DEFAULT_TYPE, notifyData, MessageParcel.obtain(), new MessageOption());
callBack.response(msg);
}
} catch (RemoteException exception) {
HiLog.info(LABEL_LOG, "%{public}s", "replyMsg RemoteException !");
} finally {
notifyData.reclaim();
}
}
public interface CallBack {
void response(String msg);
}
AbilitySlice中使用:
ServiceInternalAbility.getInstance().javaCallJsMsg(result, new ServiceInternalAbility.CallBack() {
@Override
public void response(String msg) {
new ToastDialog(getContext())
.setText(msg)
.setAlignment(LayoutAlignment.CENTER)
.show();
}
});
js处调用:
initAction: function (code, actionData) {
var action = {};
action.bundleName = "xxxx"; //对应ace的名字,一定要对应!!!
action.abilityName = "xxxx";//一定要对应
action.messageCode = code;
action.data = actionData;
action.abilityType = 1;
action.syncOption = 0;
return action;
},
callJavaPa: async function (code, actionData) {
try {
//初始化参数
var action = this.initAction(code, actionData);
var that = this;
var result = await FeatureAbility.subscribeAbilityEvent(action, function (result) {
console.info(" result info is: " + result);
var responseData = JSON.parse(result).data;
that.showToast(" 我的测试结果 " + responseData.msg);
});
return result;
} catch (pluginError) {
console.error("subscribe error : result= " + pluginError);
}
}
其他地方没有该文章,至此记录一下。