【每日学点鸿蒙知识】沙箱目录、图片压缩、characteristicsArray、gm-crypto 国密加解密、通知权限

server/2024/12/27 0:49:44/

1、HarmonyOS 如何创建应用沙箱目录?

下载文件,想下载到自己新建的应用沙箱目录,有什么方法实现吗?

fs.mkdir可以创建目录
参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fs-V5#fsmkdir

import { BusinessError } from '@kit.BasicServicesKit';
let dirPath = pathDir + "/testDir1/testDir2/testDir3";
fs.mkdir(dirPath, true).then(() => {console.info("mkdir succeed");
}).catch((err: BusinessError) => {console.error("mkdir failed with error message: " + err.message + ", error code: " + err.code);
});

2、HarmonyOS 从相册选择完图片之后,怎么压缩图片到指定的KB大小?

  1. 获取图片。从资源管理器获取要压缩的图片,创建ImageSource实例,设置解码参数DecodingOptions,使用createPixelMap获取PixelMap图片对象。
// 获取resourceManager资源管理器
const resourceMgr: resourceManager.ResourceManager = this.context.resourceManager;
// 获取资源管理器后,再调用resourceMgr.getRawFileContent()获取资源文件的ArrayBuffer。
resourceMgr.getRawFileContent('beforeCompression.jpeg').then((fileData: Uint8Array) => {// 获取图片的ArrayBufferconst buffer = fileData.buffer.slice(0);// 创建ImageSource实例const imageSource: image.ImageSource = image.createImageSource(buffer);// 设置解码参数DecodingOptions,解码获取PixelMap图片对象。let decodingOptions: image.DecodingOptions = {editable: true, // 是否可编辑。当取值为false时,图片不可二次编辑,如crop等操作将失败。desiredPixelFormat: 3, // 解码的像素格式。3表示RGBA_8888。}// 创建pixelMapimageSource.createPixelMap(decodingOptions).then((originalPixelMap: image.PixelMap) => {// 压缩图片compressedImage(originalPixelMap, this.maxCompressedImageSize).then((showImage: CompressedImageInfo) => {// 获取压缩后的图片信息this.compressedImageSrc = fileUri.getUriFromPath(showImage.imageUri);this.compressedByteLength = showImage.imageByteLength;this.afterCompressionSize = (this.compressedByteLength / BYTE_CONVERSION).toFixed(1);})}).catch((err: BusinessError) => {logger.error(TAG, `Failed to create PixelMap with error message: ${err.message}, error code: ${err.code}`);});
}).catch((err: BusinessError) => {logger.error(TAG, `Failed to get RawFileContent with error message: ${err.message}, error code: ${err.code}`);
});
  1. 图片压缩。先判断设置图片质量参数quality为0时,packing能压缩到的图片最小字节大小是否满足指定的图片压缩大小。如果满足,则使用packing方式二分查找最接近指定图片压缩目标大小的quality来压缩图片。如果不满足,则使用scale对图片先进行缩放,采用while循环每次递减0.4倍缩放图片,再用packing(图片质量参数quality设置0)获取压缩图片大小,最终查找到最接近指定图片压缩目标大小的缩放倍数的图片压缩数据。
// 创建图像编码ImagePacker对象
let imagePackerApi = image.createImagePacker();
// 定义图片质量参数
let imageQuality = 0;
// 设置编码输出流和编码参数。图片质量参数quality范围0-100。
let packOpts: image.PackingOption = { format: "image/jpeg", quality: imageQuality };
// 通过PixelMap进行编码。compressedImageData为打包获取到的图片文件流。
let compressedImageData: ArrayBuffer = await imagePackerApi.packing(sourcePixelMap, packOpts);
// 压缩目标图像字节长度
let maxCompressedImageByte = maxCompressedImageSize * BYTE_CONVERSION;
if (maxCompressedImageByte > compressedImageData.byteLength) {// 使用packing二分压缩获取图片文件流compressedImageData = await packingImage(compressedImageData, sourcePixelMap, imageQuality, maxCompressedImageByte);
} else {// 使用scale对图片先进行缩放,采用while循环每次递减0.4倍缩放图片,再用packing(图片质量参数quality设置0)获取压缩图片大小,最终查找到最接近指定图片压缩目标大小的缩放倍数的图片压缩数据。let imageScale = 1; // 定义图片宽高的缩放倍数,1表示原比例。let reduceScale = 0.4; // 图片缩小倍数// 判断压缩后的图片大小是否大于指定图片的压缩目标大小,如果大于,继续降低缩放倍数压缩。while (compressedImageData.byteLength > maxCompressedImageByte) {if (imageScale > 0) {imageScale = imageScale - reduceScale; // 每次缩放倍数减0.4// 使用scale对图片进行缩放await sourcePixelMap.scale(imageScale, imageScale);// packing压缩compressedImageData = await packing(sourcePixelMap, imageQuality);} else {// imageScale缩放小于等于0时,没有意义,结束压缩。这里不考虑图片缩放倍数小于reduceScale的情况。break;}}
}
  1. 获取最终图片压缩数据compressedImageData,保存图片。
let context: Context = getContext();
// 定义要保存的压缩图片uri。afterCompressiona.jpeg表示压缩后的图片。
let compressedImageUri: string = context.filesDir + '/' + 'afterCompressiona.jpeg';
try {let res = fs.accessSync(compressedImageUri);if (res) {// 如果图片afterCompressiona.jpeg已存在,则删除fs.unlinkSync(compressedImageUri);}
} catch (err) {logger.error(TAG, `AccessSync failed with error message: ${err.message}, error code: ${err.code}`);
}
// 压缩图片数据写入文件
let file: fs.File = fs.openSync(compressedImageUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, compressedImageData);
fs.closeSync(file);
// 获取压缩图片信息
let compressedImageInfo: CompressedImageInfo = new CompressedImageInfo();
compressedImageInfo.imageUri = compressedImageUri;
compressedImageInfo.imageByteLength = compressedImageData.byteLength;

3、HarmonyOS characteristicsArray descriptorsArray这俩集合中的字段参数如何对应?

ble蓝牙服务这块,调用添加服务的addServer() api 我只有3个uuid uuid_server uuid_read uuid_write拼接入参 , 对应到HarmonyOS上addServer如何对应传参。

new BluetoothGattCharacteristic(UUID_READ,...)
new BluetoothGattCharacteristic(UUID_WRITE,...)
new BluetoothGattService(UUID_Service,...)

参考addService相关文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-bluetooth-ble-V5#addservice

4、HarmonyOS原生的类似 gm-crypto 国密加解密如何实现?

相关文档如下:

  • crypto资料参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-architecture-kit-V5
  • crypto加解密开发指导:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-encrypt-decrypt-dev-V5

5、HarmonyOS 代码如何申请打开app的通知权限?

代码如何申请打开app的通知权限 现在app通知权限默认都是关的,要手动打开才行

通过配置Notification.publish发布通知接口的参数NotificationRequest中wantAgent属性实现

import notificationManager from '@ohos.notificationManager';
import WantAgent from '@ohos.app.ability.wantAgent';async function publishNotification() {let wantAgentInfo = {wants: [{bundleName: "com.example.webuseragent", // 自己应用的bundleNameabilityName: "EntryAbility",}],operationType: WantAgent.OperationType.START_ABILITIES,requestCode: 1,}const wantAgent = await WantAgent.getWantAgent(wantAgentInfo)let contentType = notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT;await notificationManager.publish({content: {contentType: contentType,normal: {title: "测试标题",text: "测试内容",}},id: 1,wantAgent: wantAgent})
}

http://www.ppmy.cn/server/153469.html

相关文章

解决element-ui table show-summary合计行不显示问题

在table的底部添加合计设置show-summary就可以了 但是给table加了一个固定高度话,就不显示了,其实这个合计是存在的 解决办法: 1.不设置固定高度 2.在vue的生命周期updated调用一下doLayout就可以了 updated () {this.$nextTick(() >…

upload-labs关卡记录5

这一关,卡了好久,这里我的靶场的源代码,和我看别的师傅发的不一样,我的这里的源码带有小写转换: 是不能通过大小写进行绕过,最后找到这个师傅的文章:upload-labs通关-CSDN博客 这里第五关用到…

2024最新教程Mac安装双系统

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前! 0.前言 最近我的老Mac Pro,2016年的,Intel的芯片&#xf…

AR 模型的功率谱

功率谱密度(Power Spectral Density, PSD)的表达式是从信号的自相关函数和系统的频率响应推导出来的,特别是对于 AR(Auto-Regressive,自回归)模型。以下是推导的过程: 1. AR 模型的定义&#xf…

iOS 多个输入框弹出键盘处理

开发中遇到这样一个场景,有多个输入框 而不同的输入框,需要页面向上偏移的距离不一样 这个时候,需要我们在获取到键盘弹出通知的时候,需要 知道我们开始进行编辑的是哪一个输入框,这个时候 需要我们知道一个技术点&…

5G -- 空口关键技术

前言: 手机(UE)和5G基站(gNodeB)之间的空中接口 新技术的特点: 1、提升速率:大带宽、新编码、高阶调制、F-OFDM、M-MIMO 2、降低时延:灵活帧结构、自包含时隙、免授权调度、D2D 3、提升覆盖:上下行解耦、EN-DC(双连…

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中,首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现,详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…

【笔记】下载mysql5.7

MySQL5.7安装超详细步骤(保姆级教程)_mysql5.7下载安装-CSDN博客 下载与安装 初次登录以及改密码 MySQL 5.7 安装教程(全步骤图解教程)_mysql5.7的安装教程-CSDN博客