环境
API9-full,OPenHarmony4.1.7.8,DevEco Studio 4.1 Release
准备工作
获取full-sdk :OpenHarmony数字化协作平台的每日构建:http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist
替换full-sdk教程:如何替换full-SDK
一、读取U盘文件(公共文件读取)
function createFileAccessHelper(): void {
try { // this.context是EntryAbility传过来的Context
fileAccessHelperAllServer = fileAccess.createFileAccessHelper(context);
if (!fileAccessHelperAllServer) {
console.error("createFileAccessHelper interface returns an undefined object");
}
} catch (err) {
console.error("createFileAccessHelper failed, errCode:" + err.code + ", errMessage:" + err.message);
}
}
具体可查:@ohos.file.fileAccess (公共文件访问与管理)(系统接口)
async function getRoots(): Promise<void> {
let rootIterator: fileAccess.RootIterator;
let isDone: boolean = false;
try {
rootIterator = await fileAccessHelperAllServer.getRoots();
if (!rootIterator) {
console.error("getRoots interface returns an undefined object");
return;
}
while (!isDone) {
let result = rootIterator.next();
console.info("next result = " + JSON.stringify(result));
isDone = result.done;
if (!isDone)
rootInfos.push(result.value);
const device = result.value;
// console.info('=------deviceType---' + device.deviceType)
// console.info('=------uri---' + device.uri)
// console.info('=------displayName---' + device.displayName)
// console.info('=------deviceFlags---' + device.deviceFlags)
if (device.deviceType == 6) { //只获取U盘所在的文件信息
console.info(TAG + 'get usb devices!')
let isFileDone = false
// 获取第一级符合条件的文件(夹)信息
let fileIterator = device.listFile()
if (!fileIterator) {
console.error(TAG + "listFile interface returns an undefined object")
}
while (!isFileDone) {
// 获取USB设备目录下文件信息
let fileData = fileIterator.next()
isFileDone = fileData.done
// 目标文件信息
Index.fileList.push(fileData.value)
//console.info(TAG + 'get goal!')
}
for(let i = 0;i < Index.fileList.length;i++){
const file = Index.fileList[i];
if(!file){
continue
}
console.info("file uri :" + file.uri);
list.add({
uri: file.uri,
fileName: file.fileName,
mode: file.mode,
size: file.size,
mtime: file.mtime,
mimeType: file.mimeType,
})
}
console.info(TAG + list);
}
}
}catch(err) {
console.error("getRoots failed, errCode:" + err.code + ", errMessage:" + err.message);
}
}
以异步方法获取helper对象连接的文件管理服务类的设备根节点信息,再将U盘的内容遍历存入list中,并创建list加入各个元素,保存U盘所读取文件的各个参数。
二、复制hap安装包到沙箱路径
import fs from '@ohos.file.fs'; @ohos.file.fs (文件管理)
使用的文件管理的API,只能对本应用下的文件进行操作,所以需要将U盘内的hap包复制到沙箱路径下。可以使用静态路径初步验证功能。
srcPath为从U盘获取到的文件路径
dstPath可使用 this.context.fileDir进行获取当前应用的文件沙箱路径 应用上下文Context
async function copyfile(srcPath,dstPath,name){
let appPath = dstPath + "/" + name;
let SrcPath = srcPath;
console.info('pub uri:' + uri)
console.info('pub srcpath '+ srcPath)
let sanFile = fs.openSync(appPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let pubFile = fs.openSync(SrcPath,fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.copyFileSync(pubFile.fd,sanFile.fd);
if(fs.access(appPath)){
promptAction.showToast({message: '复制成功!', duration: 2000});
}else {
promptAction.showToast({message: '复制失败!', duration: 2000});
}
fs.closeSync(sanFile);
fs.closeSync(pubFile);
}
三、安装HAP
只要复制到沙箱路径下就基本完成了。可以写死路径,也可以做动态获取。
这里用的是westinyang大佬所写的直装文件,可以看看这位大佬做的其他文章,非常有帮助。
#2023盲盒+码# 设备端直装hap的具体方案1:使用包管理API-鸿蒙开发者社区-51CTO.COM
async function installApp() {
//let hapFilePaths = ['/data/storage/el2/base/haps/entry/files/testhap.hap'];
let hapFilePaths = [context.filesDir+'/'+Index.HapName];
let installParam = {
userId: 100,
isKeepData: false,
installFlag: 1,
};
try {
installer.getBundleInstaller().then(data => {
data.install(hapFilePaths, installParam, err => {
if (err) {
console.error('install failed:' + err.message);
console.info('安装失败:' + err.message);
promptAction.showToast({message: '安装失败:' + err.message, duration: 2000});
} else {
console.info('install successfully.');
promptAction.showToast({message: '安装成功', duration: 2000});
}
});
}).catch(error => {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '安装失败:' + error.message, duration: 2000});
});
} catch (error) {
console.error('getBundleInstaller failed. Cause: ' + error.message);
promptAction.showToast({message: '安装失败:' + error.message, duration: 2000});
}
}
因为接触没几个月的openharmony设备,只放了具体功能实现的关键步骤,当作记录并分享。有什么写的不好的地方,还请多多指正。
309

被折叠的 条评论
为什么被折叠?



