HarmonyOS鸿蒙Next中不申请受限权限如何保存视频到手机相册?

HarmonyOS鸿蒙Next中不申请受限权限如何保存视频到手机相册? 申请受限权限ohos.permission.WRITE_IMAGEVIDEO,但官方好像不允许通过,建议使用系统自带的API方式实现,但文档中提供的“使用保存控件”描述过于简单,不能实现应用中保存视频到手机相册。有没有保存视频到手机相册的demo范例?

3 回复

参考demo如下

import common from '@ohos.app.ability.common';
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError, request } from '@kit.BasicServicesKit';
import { buffer } from '@kit.ArkTS';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;

async function readWriteFile(): Promise<void> {
  let helper = photoAccessHelper.getPhotoAccessHelper(context);
  let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
  let destFile = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

  // 打开文件
  let srcFile = fs.openSync(cacheDir + '/a.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

  // 读取源文件内容并写入至目的文件
  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = {
    offset: readSize,
    length: bufSize
  };
  let readLen = fs.readSync(srcFile.fd, buf, readOptions);

  while (readLen > 0) {
    readSize += readLen;
    let writeOptions: WriteOptions = {
      length: readLen
    };
    fs.writeSync(destFile.fd, buf, writeOptions);
    readOptions.offset = readSize;
    readLen = fs.readSync(srcFile.fd, buf, readOptions);
  }

  // 关闭文件
  fs.closeSync(srcFile);
  fs.closeSync(destFile);
}

@Entry
@Component
struct Index {
  @State message: string = 'Save Demo';

  downLoad() {
    try {
      request.downloadFile(context, {
        url: 'xxxx',
        filePath: cacheDir + '/a.jpg'
      }).then((downloadTask: request.DownloadTask) => {
        downloadTask.on('complete', () => {
          console.info('download complete');
          let file = fs.openSync(cacheDir + '/a.jpg', fs.OpenMode.READ_WRITE);
          let arrayBuffer = new ArrayBuffer(1024);
          let readLen = fs.readSync(file.fd, arrayBuffer);
          let buf = buffer.from(arrayBuffer, 0, readLen);
          console.info(`The content of file: ${buf.toString()}`);
          fs.closeSync(file);
        });
      }).catch((err: BusinessError) => {
        console.error(`Invoke downloadTask failed, code is ${err.code}, message is ${err.message}`);
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Invoke downloadFile failed, code is ${err.code}, message is ${err.message}`);
    }
  }

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('SaveDemo')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          //this.downLoad()
        })
      SaveButton({ text: SaveDescription.SAVE_IMAGE }).onClick(async (_event: ClickEvent, result: SaveButtonOnClickResult) => {
        if (result == SaveButtonOnClickResult.SUCCESS) {
          readWriteFile();
        } else {
          AlertDialog.show({ message: "设置权限失败" })
        }
      })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中不申请受限权限如何保存视频到手机相册?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,若不申请受限权限,无法直接保存视频到手机相册。系统出于安全考虑,对涉及用户隐私和敏感数据的操作进行了权限限制。保存视频到相册通常需要访问存储权限,而存储权限属于受限权限,未经用户授权无法使用。

鸿蒙系统对权限管理采用了分级机制,受限权限必须通过用户明确授权才能使用。未申请受限权限的情况下,应用无法直接写入外部存储,因此无法将视频保存到手机相册。若需实现该功能,必须申请相应的存储权限并获取用户授权。

在HarmonyOS鸿蒙Next中,如果未申请受限权限,仍可通过MediaStore API将视频保存到手机相册。具体步骤如下:

  1. 获取ContentResolver:通过context.getContentResolver()获取实例。
  2. 创建ContentValues:设置视频的元数据,如MediaStore.Video.Media.DISPLAY_NAMEMediaStore.Video.Media.MIME_TYPE等。
  3. 插入视频:使用ContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues)插入视频,并获取Uri
  4. 写入视频数据:通过ContentResolver.openOutputStream(uri)将视频数据写入到指定Uri

此方法无需申请受限权限,但仍需WRITE_EXTERNAL_STORAGE权限。

回到顶部