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将视频保存到手机相册。具体步骤如下:
- 获取
ContentResolver:通过context.getContentResolver()获取实例。 - 创建
ContentValues:设置视频的元数据,如MediaStore.Video.Media.DISPLAY_NAME、MediaStore.Video.Media.MIME_TYPE等。 - 插入视频:使用
ContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues)插入视频,并获取Uri。 - 写入视频数据:通过
ContentResolver.openOutputStream(uri)将视频数据写入到指定Uri。
此方法无需申请受限权限,但仍需WRITE_EXTERNAL_STORAGE权限。

