混合开发应用侧-JSBridge,在加载的网页中调用原生能力

在加载的网页中, 需要调用原生能力, 主要包括:

  1. 认证信息
  • 查询用户信息
  • 更新用户信息
  • 移除用户
  1. 拍照服务/相册服务
  2. 传感器
  3. 本地省市区数据

1.注册JavaScript代理

通过代理实现原生与网页之间的交互 

webInit() {this.controller.registerJavaScriptProxy({ // 参与注册的应用侧JavaScript对象。// 注册对象的名称,与window中调用的对象名一致。// 注册后window对象可以通过此名字访问应用侧JavaScript对象。// ...}, 'mk', [  // 参与注册的应用侧JavaScript对象的方法。// ...])
}// ...Web({ src: this.src, controller: this.controller })
.onAppear(() => {  // 组件挂载显示时触发此回调this.webInit()})

2.认证信息用户信息Auth

import { auth, User } from '../utils/auth'webInit() {this.controller.registerJavaScriptProxy({ queryUser: (): User => auth.getUser(), // 查询用户removeUser: (): void => auth.removeUser(), // 移除用户updateUser: (user: MkUser): void => auth.updateUser(user),  // 更新用户}, 'App', [  'queryUser','updateUser','removeUser',])
}

3.拍照服务 pickerCamera

相机选择器

文件管理

Util工具函数

  1. 打开相机后置摄像头得到拍照结果集
  2. 根据结果集的URI属性同步打开文件
  3. 以同步方法获取文件详细属性信息
  4. 定义缓冲区用于保存读取的文件
  5. 开始同步读取内容到缓冲区
  6. 读取完毕后关闭文件流
  7. 借助util工具方法把读取的文件流转成base64编码的字符串
import { camera, cameraPicker } from '@kit.CameraKit';
import fs from '@ohos.file.fs';
import { util } from '@kit.ArkTS';
import { cameraPlugin } from '../plugins/CameraPlugin'webInit() {this.controller.registerJavaScriptProxy({ queryUser: (): User => auth.getUser(), // 查询用户removeUser: (): void => auth.removeUser(), // 移除用户updateUser: (user: MkUser): void => auth.updateUser(user),  // 更新用户pickerCamera: (): Promise<string> => cameraPlugin.pickerCamera(), // 调用相机}, 'App', [  'queryUser','updateUser','removeUser','pickerCamera',])
}class CameraPlugin {async pickerCamera(){// 1. 打开相机后置摄像头得到拍照结果集const pickerProfile: cameraPicker.PickerProfile = {cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK};const pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(),[cameraPicker.PickerMediaType.PHOTO], pickerProfile);// 2. 根据结果集的URI属性同步打开文件const file = fs.openSync(pickerResult.resultUri)// 3. 同步读取文件的详情信息const stat = fs.statSync(file.fd)// 4. 定义缓冲区用于保存读取的文件const buffer = new ArrayBuffer(stat.size)// 5. 开始同步读取内容到缓冲区fs.readSync(file.fd, buffer)// 6. 读取完毕后关闭文件流fs.closeSync(file)// 7. 借助util工具方法把读取的文件流转成base64编码的字符串const helper = new util.Base64Helper()const str = helper.encodeToStringSync(new Uint8Array(buffer))console.log('mk-logger', 'pickerCamera', str)return str}
}export const cameraPlugin = new CameraPlugin()

 

4.相册服务 pickerPhoto

相册选择器

新版API

import { picker } from '@kit.CoreFileKit'
import fs from '@ohos.file.fs';
import { util } from '@kit.ArkTS';
import { photoPlugin } from '../plugins/PhotoPlugin'webInit() {this.controller.registerJavaScriptProxy({ queryUser: (): User => auth.getUser(), // 查询用户removeUser: (): void => auth.removeUser(), // 移除用户updateUser: (user: MkUser): void => auth.updateUser(user),  // 更新用户pickerCamera: (): Promise<string> => cameraPlugin.pickerCamera(), // 调用相机pickerPhoto: (): Promise<string> => photoPlugin.pickerPhoto(),  // 调用相册}, 'App', [  'queryUser','updateUser','removeUser','pickerCamera',])
}class PhotoPlugin {async pickerPhoto(){// 1. 打开相册选择图片let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber = 5;let photoPicker = new photoAccessHelper.PhotoViewPicker();const res = await photoPicker.select(PhotoSelectOptions)console.log('mk-logger', 'photoPlugin', JSON.stringify(res))// 2. 文件操作// 2.1 获取照片的uri地址const uri = res.photoUris[0]// 2.2 根据uri同步打开文件const file = fs.openSync(uri)// 2.3 同步获取文件的详细信息const stat = fs.statSync(file.fd)// 2.4 创建缓冲区存储读取的文件流const buffer = new ArrayBuffer(stat.size)// 2.5 开始同步读取文件流到缓冲区fs.readSync(file.fd, buffer)// 2.6 关闭文件流fs.closeSync(file)// 3. 转成base64编码的字符串const helper = new util.Base64Helper()const str = helper.encodeToStringSync(new Uint8Array(buffer))console.log('mk-logger', 'photoPlugin-str', str)return str}
}export const photoPlugin = new PhotoPlugin()

5.传感器 vibrator

import { vibrator } from '@kit.SensorServiceKit'class SensorPlugin {vibrator() {vibrator.startVibration({ type: 'time', duration: 50 }, { usage: 'touch' })}
}export const sensorPlugin = new SensorPlugin()

同上添加交互的方法,方法名

6.本地数据 getAreaColumns

  1. 定义读取的本地数据的数据类型(AreaDataItem)
  2. 定义输出数据的数据类型(AreaColumns)
  3. 读取rawfile目录下的本地文件area.json
  4. 将读取的字节数组转码成字符串
  5. 将读取的Json字符串转成对象数据
  6. 遍历对象数据并处理返回

util工具函数

获取resources/rawfile目录下对应的rawfile文件内容

将读取的字节数组转成字符串

将资源加到 src/main/resources/rawfile 中

import { util } from '@kit.ArkTS'// 1. 定义读取的本地数据的数据类型(AreaDataItem)
export interface AreaDataItem {code: stringname: stringareaList: AreaDataItem[]
}// 2. 定义输出数据的数据类型(AreaColumns)
export interface AreaColumns {province_list: Record<number, string>city_list: Record<number, string>county_list: Record<number, string>
}class  LocationPlugin {async getAreaColumns(){// 1. 定义对象用于存储转换后的数据const areaColumns: AreaColumns = {province_list: {},city_list: {},county_list: {}}try {// 2. 读取rawfile目录下的本地文件const unit8Array = getContext().resourceManager.getRawFileContentSync('area.json')// 3. 将读取的字节数组转成字符串const decoder = new util.TextDecoder()const resStr = decoder.decodeWithStream(unit8Array)// 4. 将读取的Json字符串转成对象数组const areaData = JSON.parse(resStr) as AreaDataItem[]// 5. 遍历处理数据// 5.1 省转换areaData.forEach((province)=>{areaColumns.province_list[Number(province.code)] = province.name// 5.2 市转换province.areaList.forEach((city)=>{  areaColumns.city_list[Number(city.code)] = province.name// 5.3 区转换city.areaList.forEach((county)=>{areaColumns.county_list[Number(county.code)] = county.name})})})// 6. 返回数据return areaColumns} catch (e) {return areaColumns}}
}export const locationPlugin = new LocationPlugin()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146157.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】泛微OA E-Office jx2_config.ini 敏感信息泄漏漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

buucft hashcat

使用文本编辑器打开时乱码 使用010editor打开发现时xml文档 拷贝到kali&#xff0c;使用binwalk查看&#xff0c;发现时xml文档&#xff0c;改后缀名为ppt。打开发现有密码 Accent OFFICE Password Recovery 64位-Office密码恢复软件 v20.09 免费版 - 下载吧 试试这个Accent O…

飞腾计算模块RapidIO性能测试

1、背景介绍 飞腾计算模块采用FT2000 64核处理器&#xff0c;搭配Tsi721 PCIE转RapidIO芯片&#xff0c;实现飞腾平台下的SRIO数据通信。操作系统采用麒麟信安&#xff0c;内核版本4.19.90. 2、驱动加载 驱动加载部分类似之前写过的X86平台下的RapidIO驱动加载&#xff0c;具…

Ngnix 在windows上的简单使用

安装 下载链接: nginx: download 选择页面中 Stable version 下的windows版本直接下载解压到本地。 运行nginx: 解压到本地后,结构如图: cmd 进入到上图的根目录,运行 start nginx ,即可开启。 打开 http://localhost 进行查看,如果正常打开nginx的测试页面,则说…

借10万块,年化利息明明是3.8%,为啥就变成了2.07%?

今天咱们来聊一聊贷款的奥秘&#xff0c;特别是那个令人爱恨交织的年利率。听起来直观得很&#xff0c;3.8%就像是每年给银行支付贷款总额的3.8%作为利息&#xff0c;但实际上&#xff0c;这里面的学问挺深的。有时候&#xff0c;名义上的3.8%年化&#xff0c;最终一算&#xf…

电子元器件之MOS管,附上几个常用MOS管电路和仿真。

MOS管是一种常用的电子元器件。 1.MOS管的类别 MOSFET简称MOS&#xff0c;是一种绝缘栅型场效应管。按照类别可以分为增强型mos管和耗尽型mos管。 导电沟道的形成方式‌ 增强型MOS管&#xff1a;在没有外加电压时&#xff0c;源极和漏极之间没有导电沟道存在。只有当栅极电…

打开Anaconda Navigator没反应,卡在Initializing...的解决方案

一、问题描述 打开Anaconda Navigator时&#xff0c;一直卡在Initializing...没反应&#xff0c;如下图所示&#xff1a; 二、解决方案 进入Anaconda安装目录下找到并打开文件夹attribution&#xff08;笔者Anaconda安装目录在D盘下&#xff0c;读者可自行查找自己安装目录中…

基于stm32物联网身体健康检测系统

在当今社会&#xff0c;由于经济的发展带来了人们生活水平不断提高&#xff0c;但是人们的健康问题却越来越突出了&#xff0c;各种各样的亚健康随处可在&#xff0c;失眠、抑郁、焦虑症&#xff0c;高血压、高血糖等等侵袭着人们的健康&#xff0c;人们对健康的关注达到了一个…

超越极限!Qwen2.5 助力多领域智能应用

前沿科技速递&#x1f680; 近日&#xff0c;Qwen2.5 系列重磅发布&#xff0c;成为开源语言模型领域的又一里程碑。作为一款全新的通用语言模型&#xff0c;Qwen2.5 在支持自然语言处理的基础上&#xff0c;还在编程、数学等领域进行了专项优化。Qwen2.5 模型支持长文本生成&a…

2024年中国研究生数学建模竞赛D题“大数据驱动的地理综合问题”全析全解

问题一解答&#xff1a;降水量与土地利用/土地覆被类型的时空演化特征描述 1. 降水量的描述性统计方法 降水量是一个连续变化的变量&#xff0c;可以通过以下几种描述性统计方法进行时空演化特征的总结&#xff1a; 平均降水量&#xff1a;统计中国范围内1990至2020年各年份的…

初步认识C++模版

前言 在C语言中&#xff0c;我们知道函数的形参需要指定类型&#xff0c;但是在C中&#xff0c;我们可以模版实现各种类型参数的通用函数。 1. 泛型编程 我们通过函数重载实现多种类型的同一作用的函数。如交换函数&#xff1a; void Swap(int& left, int& right) …

linux下将txt转成xlsx

在Linux环境下&#xff0c;可以使用Python的pandas库将TXT文件转换为Excel文件。以下是一个简单的示例代码&#xff1a; 首先&#xff0c;确保安装了pandas和openpyxl库&#xff1a; pip install pandas openpyxl 然后&#xff0c;使用以下Python脚本将TXT文件转换为Excel文件…

基于单片机汽车驾驶防瞌睡防疲劳报警器自动熄火设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

项目第四弹:交换机、队列、绑定信息管理模块分析与代码实现

项目第四弹&#xff1a;交换机、队列、绑定信息管理模块分析与代码实现 一、模块设计分析1.模块划分2.功能需求 二、交换机模块的实现1.交换机结构体的实现2.交换机持久化管理模块的实现3.交换机对外管理模块实现声明、删除交换机时的查找不能复用exists函数为何持久化管理模块…

查找算法 01分块查找

自己设计一个分块查找的例子&#xff0c;不少于15个数据元素&#xff0c;并建立分块查找的索引 基于上述例子&#xff0c;计算查找成功的ASL、查找失败的ASL 拓展&#xff1a; ‌‌分块查找的平均查找长度&#xff08;‌ASL&#xff09;的计算公式如下‌&#xff1a;‌ ‌顺序…

ESP32 JTAG 调试

前言 个人邮箱&#xff1a;zhangyixu02gmail.com本人使用的是 Ubuntu 环境&#xff0c;采用 GDB 方式进行调试。对于新手&#xff0c;我个人还是建议参考ESP32S3学习笔记&#xff08;0&#xff09;—— Vscode IDF环境搭建及OpenOCD调试介绍进行图形化的方式调试。如果是希望在…

占领矩阵-第15届蓝桥省赛Scratch中级组真题第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第190讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

Python酷库之旅-第三方库Pandas(122)

目录 一、用法精讲 541、pandas.DataFrame.take方法 541-1、语法 541-2、参数 541-3、功能 541-4、返回值 541-5、说明 541-6、用法 541-6-1、数据准备 541-6-2、代码示例 541-6-3、结果输出 542、pandas.DataFrame.truncate方法 542-1、语法 542-2、参数 542-3…

植保无人机是朝阳产业还是夕阳产业?

植保无人机产业是朝阳产业还是夕阳产业&#xff0c;可以从多个维度进行分析&#xff1a; 一、市场需求与增长趋势 市场需求&#xff1a;随着农业现代化的推进和劳动力成本的上升&#xff0c;植保无人机因其高效、安全、节省农药等优势&#xff0c;在农业生产中的应用越来越广…

自闭症能上寄宿学校吗?了解解答与选择

在探讨自闭症儿童教育的话题时&#xff0c;寄宿学校作为一种特殊的教育模式&#xff0c;常常引发家长们的关注与讨论。对于自闭症儿童而言&#xff0c;寄宿学校既是一个充满挑战的新环境&#xff0c;也是一个能够促进他们独立成长与社交融合的重要平台。今天&#xff0c;我们将…