openHarmony Hap直装 U盘拷贝到应用沙箱路径并安装

环境

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设备,只放了具体功能实现的关键步骤,当作记录并分享。有什么写的不好的地方,还请多多指正。

OpenHarmony系统中使用HAP(HarmonyOS Ability Package)进行应用升级可以通过以下常见方式: #### 自动升级 应用市场可以实现自动升级功能。当应用开发者发布了新版本的HAP包后,应用市场检测到该应用有更新,在满足用户设置的自动升级条件(如在WiFi环境下、电量充足等)时,会自动下载安装新的HAP包,以完成应用的升级。此过程对用户来说是相对无感的,用户设备会在后台自动处理升级操作。 #### 手动升级 - **应用市场手动升级**:用户打开应用市场,在应用市场的“更新”页面中,可以看到有更新的应用列表。找到需要升级的应用,点击“更新”按钮,应用市场会下载新的HAP进行安装,完成应用的升级。 - **通过系统自带的软件更新功能**:部分情况下,系统会对应用的更新进行统一管理。用户可以在系统的“设置” - “软件更新”中查看是否有应用的更新提示。如果有,按照提示操作即可下载安装新的HAP包,实现应用升级。 #### 代码实现升级(针对开发者) 开发者也可以在应用内实现升级逻辑。以下是一个简单的示例代码(伪代码),展示如何通过网络请求获取最新版本信息触发升级: ```java import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.event.notification.NotificationHelper; import ohos.event.notification.NotificationRequest; import ohos.net.HttpResponseCache; import ohos.net.NetHandle; import ohos.net.NetManager; import ohos.rpc.RemoteException; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class UpdateAbility extends Ability { private static final String UPDATE_SERVER_URL = "http://your-update-server.com/app-update-info"; private static final int UPDATE_NOTIFICATION_ID = 1; @Override public void onStart(Intent intent) { super.onStart(intent); checkForUpdate(); } private void checkForUpdate() { new Thread(() -> { try { URL url = new URL(UPDATE_SERVER_URL); NetManager netManager = NetManager.getInstance(this); NetHandle netHandle = netManager.getDefaultNet(); HttpURLConnection connection = (HttpURLConnection) netHandle.openConnection(url); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); // 解析服务器返回的版本信息 // 假设解析后得到最新版本号和下载地址 String latestVersion = "2.0"; String downloadUrl = "http://your-update-server.com/app-latest.hap"; if (isUpdateAvailable(latestVersion)) { showUpdateNotification(downloadUrl); } } } catch (IOException e) { e.printStackTrace(); } }).start(); } private boolean isUpdateAvailable(String latestVersion) { // 比较当前应用版本和最新版本 // 假设当前版本是1.0 String currentVersion = "1.0"; return !currentVersion.equals(latestVersion); } private void showUpdateNotification(String downloadUrl) { NotificationRequest request = new NotificationRequest(UPDATE_NOTIFICATION_ID); request.setContent("有应用更新可用,点击下载"); try { NotificationHelper.notify(request); } catch (RemoteException e) { e.printStackTrace(); } // 可以添加点击通知后的下载和安装逻辑 } } ``` 在上述代码中,应用启动时会检查服务器上的最新版本信息。如果发现有新版本,会通过系统通知提醒用户进行更新。用户点击通知后,可以实现下载新的HAP安装的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值